我仍然是Python的新手,所以请原谅我这个问题,如果它是愚蠢的。我无法通过谷歌找到答案......
我在我的代码中使用PyFFTW,它有一个计划阶段,在其中传递两个变量(源/目标),即从/转换。然后,当您调用FFT操作精确的存储空间时,这些变量在规划阶段就位于此处。因此,需要对变量进行任何操作,以便这两个变量在内存中的位置不会改变。
我找到了运算符*=
,+=
等,它们用于标准数学运算符。
但是在我的程序中,我需要将一个函数应用于变量,该变量应该将它返回到相同的内存位置。
怎么做?!
我最初以下列方式使用切片:
a[:] = func(a)[:]
但是我刚刚意识到,这非常慢(我的代码慢了大约10%)。 那么有人知道如何解决这个问题吗?
非常感谢任何帮助。提前致谢!
答案 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评论作为答案......