我在 python 中有一个 for 循环,它迭代了将近 250 万次,并且需要很长时间才能得到结果。在 JS 中,我可以在将近 1 秒内完成此操作,但在我的计算机上,Python 在 6 秒内完成。在这种情况下我必须使用 Python。这是代码:
for i in xrange(k,p,2):
arx = process[i]
ary = process[i+1]
for j in xrange(7,-1,-1):
nx = arx + dirf[j]
ny = ary + dirg[j]
ind = ny*w+nx
if data[ind] == e[j]:
process[c]=nx
c=c+1
process[c]=ny
c=c+1
matrix[ind]=1
以下是代码中的一些列表: process = [None] * (11000*4) 它的项目在赋值后将被替换为整数。
dirf = [-1,0,1,-1,1,-1,0,1]
dirg = [1,1,1,0,0,-1,-1,-1]
e = [9, 8, 7, 6, 4, 3, 2, 1]
数据列表由来自 rgba 图像像素的“r”信息组成。 data = imgobj.getdata(0)
我怎样才能提升它。我究竟做错了什么?关于for循环还有其他方法吗?谢谢。
请您参考如下方法:
这里有一些改进代码的建议:
内部 xrange 被大量使用:如果您将其设为常规列表并执行如下操作会怎样:
inner = range(7,-1,-1) # make the actual list
for(a,b,c): #first for
#stuff
for i in inner # reference an actual list and not the generator
证据:
n = range(7,-1,-1)
def one():
z = 0
for k in xrange(100):
for i in n:
z+=1
def two():
z = 0
for k in xrange(100):
for i in xrange(7,-1,-1):
z+=1
if __name__ == '__main__':
import timeit
print("one:")
print(timeit.timeit("one()",number=1000000 ,setup="from __main__ import one"))
print("two:")
print(timeit.timeit("two()",number=1000000 ,setup="from __main__ import two"))
"result"
one:
37.798637867
two:
63.5098838806
如果我编写的代码具有可比性,那么似乎表明引用内部列表而不是生成确实加快了速度。 [编辑] 引用局部变量比访问全局变量更快。 因此,如果这是正确的,请将列表定义放置在尽可能靠近循环的位置,而不是每次都生成它。
您还更改了两次流程。如果不需要,就选择一个。
正如您在评论中提到的,您说您正在处理图像。我不确定以下内容是否相关,但也许您可以使用 openCV,它有一个用于 C 代码的 Python API。那可能会加快速度。正如其他人所提到的:numpy 和您自己的 cython 扩展将大大加快速度。
