如何有效地循环遍历矩阵元素?

时间:2015-02-19 15:19:50

标签: python arrays loops numpy matrix

我必须循环一个800 000 * 800 000矩阵。我尝试通过简单的循环来做到这一点,但它花了我这么大的时间。我怎样才能快速循环?

for in in xrange(800000):
   for j in xrange(800000):
      print i,j

通常,我正在使用OpenCV读取图像,然后我需要遍历每个像素,以便执行一些计算并与像素的邻居的某些特征的值进行比较。当我运行一个循环时,我觉得它需要超过2天才能完成。

事实上,我想实现我自己的GrowCut算法版本。作者声称使用像我这样的计算机在不到4分钟的时间内执行算法。然而,循环超过1200 * 1100矩阵需要花费很多时间(我测试过)。我怎样才能快速阅读它们?

3 个答案:

答案 0 :(得分:1)

对于高性能数组循环,您可以使用Cython。您可以使用Python的大部分语法,使用C语言可以获得很多性能提升。它还与NumPy兼容。

Iterating over arrays with Cython.

答案 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