Python: 显式字符串参数会影响性能吗?

1 投票
2 回答
506 浏览
提问于 2025-04-15 19:23

假设有一个函数,它总是接收一个参数 s,但这个参数在函数内部并没有被使用。

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

现在考虑这样一次调用:

someFunc("the unused string")

这里传入的参数是一个字符串,这个字符串不是在程序运行时生成的,而是直接编译进了程序的二进制文件里(希望这个理解是对的)。

问题是:如果以这种方式调用 someFunc 几千次,虽然“未使用的字符串”的引用总是被传递,这会不会导致程序变慢呢?

在我简单的想法里,我认为“未使用的字符串”的引用是‘常量’,在调用 someFunc 时可以在 O(1) 的时间内获取。所以我觉得‘不会影响性能’。

之前的问题一样:“我这样想对吗?”

谢谢大家的帮助 :-)

2 个回答

2

这是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模块的字符串都不一定具备这个特性。不过,这依然是个有趣的点。

2

每次都是通过引用传递这个字符串,但这个过程的开销非常小,基本上不会影响性能,除非是在一个非常紧凑的循环里。

撰写回答