【问题标题】:Optimizing and multiprocessing a specific part of program for faster execution优化和多处理程序的特定部分以加快执行速度
【发布时间】:2020-03-31 23:25:47
【问题描述】:

我正在运行一个需要很长时间才能完成的特定程序,然后我意识到我可能正在做一些完全愚蠢的事情。再加上程序没有充分利用我的 CPU 的这一事实,我在这里寻求帮助以优化代码的核心。

我对 Python 中的多处理不是很满意,所以这个网站上的所有答案都没有太大帮助。

我正在使用的具体代码是:


k=10000

for i in range(2,k):
  n=i

  people=[]
  for i in range(1,n+1):
    people.append(i) #create list of people, labelled with integers

  while(len(people)>1): #the game ends when there is 0 or 1 people left
    shoot=[]

    for i in people:
      choice=i
      while(choice==i):
        choice=random.choice(people) #i-th chooses a person to kill and can't choose himself
      shoot.append(choice)

    for i in shoot:
      if(i in people):
        people.remove(i) #remove killed people

问题在于people 数组可能是一个巨大的列表(k 是一个巨大的数字),并且在最坏的情况下操作的数量是 k 阶乘的数量级,这可能非常大。

我想使用您可能建议的任何优化,并且如果可能的话,我想知道如何在这里使用多处理。如果有帮助的话,我有 8 个虚拟核心。

感谢任何输入。

【问题讨论】:

  • 你要的是每个i的拍摄清单?
  • 对。这是主要内容。
  • 您能解释一下您要做什么吗?更具体地说,while choice==i 的部分
  • 基本上有一群人在玩一个游戏。每个人随机选择另一个人杀死。 choice==i while 循环阻止他们选择自己被杀死。然后删除选定的人并继续游戏,直到剩下 1 人或没有人。
  • 我在代码中添加了一些 cmets 以帮助理解它。如果您还有其他问题,请告诉我。

标签: python python-3.x optimization python-multiprocessing


【解决方案1】:

我认为它不会比这更快:

import numpy as np
import concurrent
import random

k=10
num_workers = 8

def choose_shoot(people, idx):
    shoot = random.choice(tuple(people - set([idx])))
    return shoot

def find_shoot(n):

    people = set(np.arange(1, n+1))

    while(len(people)>1):

        shoot = set([*map(lambda x: choose_shoot(people, x), people)])
        people = set([*filter(lambda x: x not in shoot, people)])

    return people, len(people)

with concurrent.futures.ThreadPoolExecutor(max_workers=num_workers) as pool:
        survivors, sizes = zip(*list(pool.map(find_shoot, range(2, k+1))))

如果你想要单例的数量,大小是每组幸存者的大小:

num_singletons = sizes.count(1)
num_empty = sizes.count(0)

【讨论】:

  • 这会在每种情况下返回幸存者的生成器
  • 有个小错误,可以用 import concurrent.futures 修复,对吗?
  • 是的,对不起!没看到
  • 没关系。感谢您的帮助。让我看看这是在做什么,并尝试理解它。
  • 非常幼稚的问题。我使用'next'运行一个循环迭代生成器,它返回一个包含1个或没有元素的集合。这些基本上都是幸存者,对吧?
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2014-10-25
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
相关资源
最近更新 更多