如何在python上加快我的脚本?
我有一个python脚本,但要运行20多个小时才能结束 由于我的代码相当大,我将发布一个简化的代码 守则的第一部分:如何在python上加快我的脚本?,python,performance,parallel-processing,Python,Performance,Parallel Processing,我有一个python脚本,但要运行20多个小时才能结束 由于我的代码相当大,我将发布一个简化的代码 守则的第一部分: flag = 1 mydic = {} for i in mylist: mydic[flag] = myfunction(i) flag += 1 mymatrix = [] for n1 in range(0,flag): mat = [] for n2 in range(0,flag): if n1 >= n2:
flag = 1
mydic = {}
for i in mylist:
mydic[flag] = myfunction(i)
flag += 1
mymatrix = []
for n1 in range(0,flag):
mat = []
for n2 in range(0,flag):
if n1 >= n2:
mat.append(0)
else:
res = myfunction2(mydic(n1),mydic(n2))
mat.append(res)
mymatrix.append(mat)
mylist
有700多个条目,每次调用myfunction
它都会运行20秒左右
所以,我在考虑是否可以使用paraller编程将迭代分为两组并同时运行。这有可能吗?我需要比以前更多的中场休息时间吗
守则第二部分:
flag = 1
mydic = {}
for i in mylist:
mydic[flag] = myfunction(i)
flag += 1
mymatrix = []
for n1 in range(0,flag):
mat = []
for n2 in range(0,flag):
if n1 >= n2:
mat.append(0)
else:
res = myfunction2(mydic(n1),mydic(n2))
mat.append(res)
mymatrix.append(mat)
因此,如果mylist
有700个条目,我想创建一个700x700矩阵,其中它是上三角矩阵。但是myfunction2()
每次大约需要30秒。我不知道我是否也能在这里使用并行编程
我无法简化myfunction()
和myfunction2()
,因为它们是我调用外部api并返回结果的函数
你有什么建议可以让我把它改得更快。第二部分用发电机,而不是一个for循环,怎么样
def fn():
for n1 in range(0, flag):
yield n1
generate = fn()
while True:
a = next(generate)
for n2 in range(0, flag):
if a >= n2:
mat.append(0)
else:
mat.append(myfunction2(mydic(a),mydic(n2))
mymatrix.append(mat)
根据您的评论,我认为30秒的时间很可能主要是由外部API调用造成的。我将添加一些计时代码,以测试代码的哪些部分实际上是造成速度缓慢的原因 如果它来自外部API调用,则有一些简单的修复方法。外部API调用block,因此如果您可以移动到并行模型,那么您将获得一个加速(尽管对我来说,30秒的阻塞听起来很大) 我认为通过将两个循环的输出作为要传递到函数中的参数矩阵,创建一个快速的“任务列表”是最容易的。然后我会将它们导入
芹菜中运行任务。这应该会给你一个体面的加速与最小的工作量
使用线程化
或多处理
模块来运行任务(或部分),或者甚至用Twisted
python编写,可能会节省更多的时间,但这通常比简单的芹菜函数花费的时间更长
使用芹菜
方法的一个警告是,您将分派大量工作-因此您必须具有一些功能来轮询结果。这可能是一个while
循环,它只睡眠(10)
并重复自己,直到芹菜对每个任务都有结果为止。如果您在Twisted
中执行此操作,则可以在完成时访问/跟踪结果。我从来没有在多核处理中做过这样的事情,所以我不知道如何适应这种情况。只有当您有多个核时,并行处理才会有帮助。@Linuxios:。。。所以它只适用于过去8年中生产的几乎所有PC…@MatteoItalia:仍然值得一提。我不会说8年。只有高端电脑才有这么长时间。@Linuxios是的。我有一台双核电脑。myfunction
到底需要20秒做什么?我怀疑这会提高性能,因为python2上的range
会返回一个列表。如果他使用的是python3,range
已经是一个迭代器,它将提供我只能假设您正在考虑的性能提升。