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

Python 如何有效地循环矩阵元素?,python,arrays,loops,numpy,matrix,Python,Arrays,Loops,Numpy,Matrix,我必须循环一个800000*800000的矩阵。我试图通过简单的循环来实现这一点,但这花费了我太多的时间。我怎样才能快速循环 for in in xrange(800000): for j in xrange(800000): print i,j 通常,我使用OpenCV读取图像,然后我需要在每个像素上循环,以便执行一些计算并与像素相邻的某些特征值进行比较。当我运行一个循环时,我觉得它需要2天以上才能完成 事实上,我想实现我自己版本的算法。作者声称使用像我这样的计算机在不到4

我必须循环一个800000*800000的矩阵。我试图通过简单的循环来实现这一点,但这花费了我太多的时间。我怎样才能快速循环

for in in xrange(800000):
   for j in xrange(800000):
      print i,j
通常,我使用OpenCV读取图像,然后我需要在每个像素上循环,以便执行一些计算并与像素相邻的某些特征值进行比较。当我运行一个循环时,我觉得它需要2天以上才能完成


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

对于性能良好的数组循环,您可以使用。您可以使用Python的大部分语法,使用C可以获得很多性能增益。它还与兼容


可以考虑使用内置的BytRayLype代替Python列表。

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

进一步看,我发现可以使用python中的数组高效地存储几乎所有内容。您可以按照上面的解释轻松地计算索引


“Numeric Python extension(NumPy)定义了另一种数组类型;有关Numeric Python的更多信息,请参阅。”

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

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
注意到这个样本有多小(只有一个测试),但是有一半的时间表示可能的增强?此外,您还可以避免使用
a=
,并且可以跳过新变量的分配,这样可以节省几微秒的时间

展示你的代码,我肯定还有其他的事情可以做


这是win7 Intel i5双核Python 3.4

您在这里比较的是什么语言?你无法用python打败C速度。无论您如何努力:)您也可以尝试隔离一段代码,其中循环处于某种独立状态(即使您必须删除一些操作)。Python循环的运行速度几乎是退化的,但是它也可能表明代码存在问题。也许在一个树状结构上有一个值的像素上循环可以有所帮助(使用np.where)等等。@ljetibo我绝对需要读取每个像素的RGB值,并将它们与该像素的相邻像素的值进行比较(如果你愿意,请检查我给出的链接……该人也用Python编程,但运行它时我会出错)试试这个链接,它列出了所有(默认)包:包括Numba。另外,我知道我的(OSX)Anaconda发行版中有它。对于OpenCV,我个人看了这里:(binstar是一个共享Anaconda软件包的地方),但也有一点:根据我的记忆,OpenCV比OSX更容易安装在Windows上,所以你有一些选择。这更多的是一个评论,而不是问题的真正答案:)谢谢。我真的需要逐元素循环矩阵元素(考虑到Growtut算法的性质),快速查看算法链接显示4个嵌套循环;也许这就是为什么OP的时间比你的长得多的原因吧?@tom10:期望这个模拟测试应该更接近OPs问题是不现实的。然而,它确实表明,在语句中使用
的循环似乎具有更快的查找时间。我相信不是他的循环导致了他的问题,而是他内心的计算。但是我不熟悉GrowCut。没有解释和他的确切代码,我帮不了多少忙。@tom10这很好,但据我所知,他可能在任何内部循环上犯了一个简单的错误(他的意思我从他发布的代码中看不出来),并且可能运行得太多了。如果他使用的是
range
,而不是
xrange
,那么如果他使用的是旧python,那么他实际上是在创建整个列表
xrange
是一个更快的迭代器。他可能已经写了自己的发电机,也许等等。。。我无法优化我没有看到的东西。非常感谢。和我的情况相比,速度太快了。你能解释一下你做了什么吗?当然,但我最初投了更高的票,因为运行循环本身会在时间上设置一个合理的下限,但看看GrowCut算法,我意识到你的测试并不真正相关。如果你运行了四个嵌套循环,那么,imho,它至少会被关闭,可能是2或10倍,但不是2的幂,也就是说,在本例中可能是数百万。(尽管如此,我还是希望有一种方法可以在不投反对票的情况下取消我的赞成票。)