我正在通过该方法查看某个文本文件中的某个字符串.
re.finditer(pattern,text)
我想知道什么时候什么也没有.这意味着它在传递的文本中找不到任何内容.
我知道可调用的迭代器,有next()
和__iter__
我想知道我是否可以获得大小或找出它是否返回不匹配我的模式的字符串.
hyn*_*cer 17
此解决方案使用较少的内存,因为它不会保存中间结果,其他解决方案使用list
:
sum(1 for _ in re.finditer(pattern, text))
Run Code Online (Sandbox Code Playgroud)
如果模式在文本中非常频繁,那么所有较旧的解决方案都具有消耗大量内存的缺点,如模式'[az]'.
测试用例:
pattern = 'a'
text = 10240000 * 'a'
Run Code Online (Sandbox Code Playgroud)
这个解决方案sum(1 for ...)
大致只使用文本的内存,即len(text)
字节.以前的解决方案list
可以使用大约58或110倍的内存.32位分配为580 MB.1.1 GB用于64位Python 2.7.
编辑3: @hynekcer的答案比这要好得多.
编辑2:如果你有一个无限的迭代器,或者一个消耗太多GB(在2010年1千兆字节仍然是大量的RAM /磁盘空间)的RAM /磁盘空间的迭代器,这将无效.
你已经看到了一个很好的答案,但这里有一个昂贵的黑客你可以使用,如果你想吃蛋糕也有它:)诀窍是我们必须克隆蛋糕,当你吃完了,我们把它放回到同一个盒子里.请记住,当迭代迭代器时,它通常变为空,或者至少丢失先前返回的值.
>>> def getIterLength(iterator):
temp = list(iterator)
result = len(temp)
iterator = iter(temp)
return result
>>>
>>> f = xrange(20)
>>> f
xrange(20)
>>>
>>> x = getIterLength(f)
>>> x
20
>>> f
xrange(20)
>>>
Run Code Online (Sandbox Code Playgroud)
编辑:这是一个更安全的版本,但使用它仍然需要一些纪律.感觉不像Pythonic.如果您发布了您尝试实现的整个相关代码示例,那么您将获得最佳解决方案.
>>> def getIterLenAndIter(iterator):
temp = list(iterator)
return len(temp), iter(temp)
>>> f = iter([1,2,3,7,8,9])
>>> f
<listiterator object at 0x02782890>
>>> l, f = getIterLenAndIter(f)
>>>
>>> l
6
>>> f
<listiterator object at 0x02782610>
>>>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10824 次 |
最近记录: |