【问题标题】:Do Python functions copy the input parameters to the function?Python函数是否将输入参数复制到函数?
【发布时间】:2014-04-26 15:57:33
【问题描述】:

我在 Python 中有以下示例:

import numpy as np
import timeit

# array size
m = 3000

# square array
a = np.random.rand(m, m)

# column vector
b = np.random.rand(m)

# solve
ti = timeit.default_timer()
x = np.linalg.solve(a, b)
tf = timeit.default_timer()

# solve function
def solver(a, b):
    x = np.linalg.solve(a, b)
    return x

tii = timeit.default_timer()
x = solver(a, b)
tff = timeit.default_timer()

print('time1 ', tf-ti)
print('time2 ', tff-tii)

不使用函数(time1)与使用函数(time2)的时间比较是:

time1  0.6199771239989786
time2  0.5945519460001378

这两种方法似乎略有不同。函数solver 的输入参数是如何处理的,是被复制还是只是传递到函数内部?

【问题讨论】:

  • 如果以相反的顺序运行测试,时间会发生什么变化?
  • @AShelly 这很有趣,如果我以相反的顺序运行测试,时间就会切换
  • 哦,是的,没有额外的函数调用会更慢 ;-) 当然,在第一次调用之前,有一些初始化需要完成。
  • 没有复制,当然,numpy 数组作为指针传递。您可以使用内存分析器进行检查,或者通过初始化使用一半以上内存的a 来进行更多临时检查,并查看它不会崩溃,至少在调用求解器之前
  • 非常有趣,反转——指向一些初始化开销。但无论如何,这两个时间值真的在统计上彼此不同吗?每个的标准错误是什么?

标签: python python-3.x numpy timeit


【解决方案1】:

速度差异可能是由于 ab 的内容的一些内存缓存,第二次调用 linalg.solve 时利用了这些内容。

为了回答这个问题,python 中的对象是通过引用传递的,因此传递参数成本的唯一区别是您在第二个示例中执行了两次。但这可能只是解决成本的一小部分。

【讨论】:

  • 我希望这里有火焰软件 :)
  • 那么对于较大的项目,与在同一个文件中执行所有操作相比,将数据传递给在另一个文件中声明的函数应该不会对整体计算时间产生不利影响?
  • 如果你很挑剔,在输入函数时进行属性查找和更改范围确实会增加一些开销(不过,ns 范围)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 2022-12-13
  • 2015-03-23
  • 2018-03-25
  • 2015-08-02
  • 1970-01-01
相关资源
最近更新 更多