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

2024-10-01 07:20:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我要循环一个800000*800000矩阵。我试着用简单的循环来完成,但是花了我太多的时间。我怎样才能快速循环?在

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

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

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


Tags: in图像版本算法for时间矩阵作者
3条回答

这是一个可能的优化,但同样这将取决于系统和其他当前运行的进程等。。。还有你在里面做的计算。在

import time
import numpy as np
test = np.ones((1200, 1100))

测试1:

^{pr2}$

所以你看循环只需要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

请注意这个样本有多小(只有一个测试),但是一半的时间表明可能有改进?此外,您还可以避免使用a=,并且可以跳过分配一个新变量,这样可以节省几微秒。在

出示你的代码,我肯定还有别的办法可以做。在

这是win7 Intel i5双核Python3.4

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

Iterating over arrays with Cython.

您可以考虑使用内置的bytearray类型而不是python列表。在

您可以创建大小为1200*1300*4的bytearray来表示矩阵。 元素i,j为i*1200*4+j*4 (假设像素大小为4字节)

进一步看,我发现可以使用python中的数组高效地存储几乎所有内容。你可以很容易地计算指数,如上所述。在

“Numeric Python扩展(numpython)定义了另一个数组类型;有关Numeric Python的详细信息,请参阅http://www.numpy.org/。”

相关问题 更多 >