来自Perl的背景,我已经习惯了:

my @words = qw(fee fi fo fum);

我想知道以下Python是否会导致运行时性能下降:
words = 'fee fi fo fum'.split()

或者words在编译时绑定(bind)。

最佳答案

甚至在PERL中也不能在编译时绑定(bind)它,因为每次您通过该语句时,都必须创建一个新的新列表。

换句话说,在Python中,当您看到

x = ['fee', 'fi', 'fo', 'fum']

该代码不能仅将特定的对象地址加载到x中,因为每次您访问该语句时,它必须是一个新的新鲜列表对象。考虑
def foo():
    return ['fee', 'fi', 'fo', 'fum']

x = foo()
x[0] = 'bar'

print foo()[0]   # must be 'fee'
print x[0]       # must be 'bar'

但是,Python对不可变进行了一些优化。例如:
def foo():
    return (1, 2, 3)

实际上总是返回相同的对象(它不会每次都分配一个新的元组),并且对于
def foo():
    return 3 * 4

它实际上返回12,而不在运行时进行乘法运算。

但是,您的示例无法解析为加载在编译时计算的常量,它必须至少是一个列表“literal”(实际上是一个列表生成器,每次生成时都会创建一个新对象)。

IIRC常量折叠仅在编译时针对数字/字符串上的二进制运算符完成,而不适用于任何函数调用(请注意,在Python中,即使不好的做法,例如更改标准函数len也是合法的,因此您不能确定len("foo")始终返回3)。

在标准字符串上仅通过常量的方法调用的确可以在编译时移动IMO,但是AFAIK目前尚未完成(而且并不常见,因此获得的 yield 不值得付出努力)。

关于python - 静态字符串的split()是运行时操作还是编译时操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18278989/

10-12 22:41