我必须循环一个800 000 * 800 000矩阵。我尝试通过简单的循环来做到这一点,但它花了我这么大的时间。我怎样才能快速循环?
for in in xrange(800000):
for j in xrange(800000):
print i,j
通常,我正在使用OpenCV读取图像,然后我需要遍历每个像素,以便执行一些计算并与像素的邻居的某些特征的值进行比较。当我运行一个循环时,我觉得它需要超过2天才能完成。
事实上,我想实现我自己的GrowCut算法版本。作者声称使用像我这样的计算机在不到4分钟的时间内执行算法。然而,循环超过1200 * 1100矩阵需要花费很多时间(我测试过)。我怎样才能快速阅读它们?
答案 0 :(得分:1)
答案 1 :(得分:0)
您可以考虑使用内置的bytearray类型而不是python列表。
您可以创建一个大小为1200 * 1300 * 4的字节数来表示矩阵。 元素i,j将在i * 1200 * 4 + j * 4 (假设像素大小为4字节)
进一步观察,我发现你可以在python中使用数组来有效地存储几乎任何东西。您可以轻松计算索引,如上所述。
" Numeric Python扩展(NumPy)定义了另一种数组类型;有关Numerical Python的更多信息,请参阅http://www.numpy.org/。"
答案 2 :(得分:-1)
这是一个可能的优化,但是,这将取决于系统和其他当前正在运行的进程等......以及您在内部进行的计算。
import time
import numpy as np
test = np.ones((1200, 1100))
测试1:
def loops():
start = time.clock()
for i in range(1200):
for j in range(1100):
a = test[i,j]
print(time.clock()-start)
return a
>>> loops()
1.433313120652599
1.0
所以你看到循环只有1.5秒。在里面添加计算会显着延长这一时间,但你的循环是最不担心的。如果不提供您的代码,我就不能多说了。
替代方法是:
def loops():
start = time.clock()
for row in test:
for element in row:
a = element
print(time.clock()-start)
return a
>>> loops()
0.714938339920252
1.0
请注意这个样本有多小(只有1个测试)但是有一半的时间表明可能的增强效果?你也可以避免使用a=
,并且可以跳过一个新变量的分配,这个变量应该减少几微秒。
显示你的代码,我确信还有别的东西可以做。
这是win7 Intel i5双核Python3.4