如何在python上加快我的脚本?

如何在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:

我有一个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:
            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
已经是一个迭代器,它将提供我只能假设您正在考虑的性能提升。