1

假设某个函数总是得到一些它不使用的参数 s。

def someFunc(s):
  # do something _not_ using s, for example
  a=1

现在考虑这个电话

someFunc("the unused string")

它给出了一个字符串作为参数,该参数不是在运行时构建的,而是直接编译成二进制文件(希望是正确的)。

问题是:当以这种方式调用 someFunc 时,比如说几千次,总是会传递对“未使用的字符串”的引用,但这会减慢程序的速度吗?

在我天真的想法中,我会说对“未使用的字符串”的引用是“常量”,并且在调用 someFunc 时在 O(1) 中可用。所以我会说'不,这不会影响性能'。

和以前一样的问题:“我说得对吗?”

感谢一些:-)

4

2 回答 2

2

字符串每次都被传递(通过引用),但是开销太小而不会真正影响性能,除非它处于超紧循环中。

于 2010-02-17T13:42:50.157 回答
1

这是 CPython 的一个实现细节,可能不适用于其他 python,但是是的,在许多情况下,在编译模块中,常量字符串将引用同一个对象,从而最大限度地减少开销。

一般来说,即使它没有,你也真的不应该担心它,因为与正在发生的其他事情相比,它可能微不足道。

然而,这里有一段有趣的代码:

>>> def somefunc(x):
...    print id(x) # prints the memory address of object pointed to by x
... 
>>> 
>>> def test():
...    somefunc("hello")
... 
>>> test()
134900896
>>> test()
134900896 # Hooray, like expected, it's the same object id
>>> somefunc("h" + "ello")
134900896  # Whoa, how'd that work?

这里发生的是 python 保持全局字符串查找,并且在许多情况下,即使您连接两个字符串,如果值匹配,您将获得相同的对象。

请注意,这是一个实现细节,您不应该依赖它,因为来自文件、套接字、数据库、字符串切片、正则表达式或任何 C 模块的字符串都不能保证具有此属性。但这仍然很有趣。

于 2010-02-17T13:57:45.937 回答