Python:如何在任务中保留可变内存位置?

时间:2011-03-10 16:39:03

标签: python memory variables fftw

我仍然是Python的新手,所以请原谅我这个问题,如果它是愚蠢的。我无法通过谷歌找到答案......

我在我的代码中使用PyFFTW,它有一个计划阶段,在其中传递两个变量(源/目标),即从/转换。然后,当您调用FFT操作精确的存储空间时,这些变量在规划阶段就位于此处。因此,需要对变量进行任何操作,以便这两个变量在内存中的位置不会改变。 我找到了运算符*=+=等,它们用于标准数学运算符。 但是在我的程序中,我需要将一个函数应用于变量,该变量应该将它返回到相同的内存位置。 怎么做?!

我最初以下列方式使用切片:

a[:] = func(a)[:]

但是我刚刚意识到,这非常慢(我的代码慢了大约10%)。 那么有人知道如何解决这个问题吗?

非常感谢任何帮助。提前致谢!

4 个答案:

答案 0 :(得分:0)

您的变量是一个可变类型,因此您的函数可以直接对其进行操作。

您仍然无法使用将要创建副本和/或进行新分配的函数和运算符(与您已经无法使用的函数和运算符相同),但函数参数的直接变换将是在功能之外可见。

答案 1 :(得分:0)

这是你要做的事吗?

def time10(a):
  """ multiple the elements by 10 in-place """
  for i in xrange(len(a)):
    a[i] *= 10
  # returning a is optional. I think it maybe useful for use to chain the operation
  return a

>>> a = range(10)
>>> time10(a)
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> b = range(10)
>>> time10(time10(b))
[0, 100, 200, 300, 400, 500, 600, 700, 800, 900]
>>> b
[0, 100, 200, 300, 400, 500, 600, 700, 800, 900]
>>>

原始代码在返回后复制数组。它通常不是一种有用的实践,并且会导致运行速度变慢。

答案 2 :(得分:0)

如何使用本地值并将其引用到全局值。我想它可以加快......

global a
a = []
def test(): 
    global a
    b = [1,2,3,4]
    a = b
....
嗯..我也必须用cProfiler

测试它

答案 3 :(得分:0)

所以最后我找不到令人满意的问题解决方案。 我最初最终使用了上面的delnan提出的解决方案

a[:] = func(a)[:]

并预先分配一定大小的数组。 很抱歉将此添加为我的答案,因为我无法弄清楚如何/如果可以接受delnans评论作为答案......