如何在python中加速数组生成?

bpa*_*ker 6 python arrays performance opencv matrix

我想我需要使用numpy或其他一些库来足够快地填充这些数组,但我不太了解它.现在这个操作在四核英特尔PC上大约需要1秒钟,但我需要它尽可能快.任何帮助是极大的赞赏.谢谢!

import cv

class TestClass:

  def __init__(self):

    w = 960
    h = 540

    self.offx = cv.CreateMat(h, w, cv.CV_32FC1)
    self.offy = cv.CreateMat(h, w, cv.CV_32FC1)

    for y in range(h):
      for x in range(w):
        self.offx[y,x] = x
        self.offy[y,x] = y
Run Code Online (Sandbox Code Playgroud)

Gar*_*err 8

我八岁(慢)计算机能够在127毫秒内创建一个与矩阵大小相同的列表.

C:\Documents and Settings\gdk\Desktop>python -m timeit "[[x for x in range(960)]
 for y in range(540)]"
10 loops, best of 3: 127 msec per loop
Run Code Online (Sandbox Code Playgroud)

我不知道cv模块是什么以及它如何创建矩阵.但也许这是代码速度慢的原因.

Numpy可能会更快.创建一个(python int)1s 数组:

C:\Documents and Settings\gdk\Desktop>python -m timeit -s "from numpy import one
s" "ones((960, 540), int)"
100 loops, best of 3: 6.54 msec per loop
Run Code Online (Sandbox Code Playgroud)

您可以比较使用不同模块创建矩阵的时间,以查看更改时间是否有益:timeit模块


Nic*_*ght 1

您将生成 50 万个整数并创建超过 100 万个引用。我很高兴这只需要 1 秒钟。

如果您经常这样做,您应该考虑缓存结果的方法。

另外,在这种情况下,在四核上任何东西都无济于事,您正在执行一次只能在一个核心上执行的串行操作(即使您对其进行线程化,CPython也只能执行一个)由于全局解释器锁,一次纯Python线程)。

  • 为什么这被标记为解决方案?它根本没有回答这个问题,而且充其量也具有误导性——在 Python 中(在典型的 PC 上)创建一百万个整数和一百万个引用不需要花费接近一秒的时间。 (5认同)