考虑从一个巨大的字符串中提取字母的问题。
一种解决方法是:
机制很清晰:列表推导式生成一个字符列表。join方法通过访问列表长度来知道需要连接多少个字符。另一种方法是:
这里的生成器推导式会得到一个生成器。join方法不知道要连接多少个字符,因为生成器没有len属性。所以这种连接方法应该比列表推导式慢。
但是在Python中进行测试表明它并不慢。为什么呢? 有人能解释一下join如何在生成器上工作吗?
需要明确的是:
一种解决方法是:
''.join([c for c in hugestring if c.isalpha()])
机制很清晰:列表推导式生成一个字符列表。join方法通过访问列表长度来知道需要连接多少个字符。另一种方法是:
''.join(c for c in hugestring if c.isalpha())
这里的生成器推导式会得到一个生成器。join方法不知道要连接多少个字符,因为生成器没有len属性。所以这种连接方法应该比列表推导式慢。
但是在Python中进行测试表明它并不慢。为什么呢? 有人能解释一下join如何在生成器上工作吗?
需要明确的是:
sum(j for j in range(100))
由于可以通过跟踪累加和来实现,因此不需要了解100的任何知识。它可以使用生成器上的next方法访问下一个元素,然后添加到累加总和中。 但是,由于字符串是不可变的,每次迭代都会创建一个新的字符串,因此逐步连接字符串需要很长时间。
join
和列表推导式所花费的时间,这是有道理的。如果你只测量join
的时间,那么生成器表达式版本会更慢,因为它必须先将整个生成器转储到一个列表中,然后才能进行任何字符串连接。这将花费与在另一个版本中构建列表推导式所需的时间大致相同的时间。 - Blckknght