是';在';“操作员”;“懒惰”;用Python?

是';在';“操作员”;“懒惰”;用Python?,python,python-3.x,Python,Python 3.x,如果我这样做,是否每次迭代都会调用split() a = [word for word in post.split() if len(word) > 10] 我是否应该这样做以获得更好的性能 s = post.split() a = [word for word in s if len(word) > 10] post.split()只调用一次。您可以通过将post.split()替换为每次调用时都会打印的函数来验证它: >>> post = 'a b c d'

如果我这样做,是否每次迭代都会调用
split()

a = [word for word in post.split() if len(word) > 10]

我是否应该这样做以获得更好的性能

s = post.split()
a = [word for word in s if len(word) > 10]
post.split()
只调用一次。您可以通过将
post.split()
替换为每次调用时都会打印的函数来验证它:

>>> post = 'a b c d'
>>> def split_post():
...     print('split_post is called')
...     return post.split()
... 
>>> a = [word for word in split_post() if len(word) > 10]
split_post is called

您不需要将表达式分成两条语句来提高性能。

单个表达式很好-
post.split()
将只调用一次

这是因为Python中的
for
循环会迭代支持迭代的对象的值——它不会不断检查在另一种语言中可能看到的某些条件语句,比如在C中循环数组

因此,在本例中,
post.split()
生成对象,然后
for
循环遍历该对象,无需再次调用



“懒惰”-ness在这里也不是合适的术语,因为它指的是将表达式计算延迟到严格需要时的做法。这里我们当然需要调用
post.split()
,问题更多的是“效率”。有关该策略的详细说明,请参见Wiki上的

这不是“懒惰”的意思。@vartec您介意再解释一下吗,或者这是一个完全不同的主题?这实际上不是
运算符中的
。这是一个关于。。。在列表理解中的…
子句中,尽管使用了相同的关键字,但这完全不是一回事。“我应该这样做以获得更好的性能吗?”您可以通过简单的尝试来回答这个问题。此网站不是您的个人性能测试服务。@sooqua