Muh*_*aha 9 python iteration performance list
检查字符串是否包含列表中任何项目的某些字符的最快方法是什么?
目前,我正在使用这种方法:
lestring = "Text123"
lelist = ["Text", "foo", "bar"]
for x in lelist:
if lestring.count(x):
print 'Yep. "%s" contains characters from "%s" item.' % (lestring, x)
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有迭代的情况下做到这一点(我认为这会让它更快.)?
Abh*_*jit 17
您可以尝试使用成员资格检查列表理解
>>> lestring = "Text123"
>>> lelist = ["Text", "foo", "bar"]
>>> [e for e in lelist if e in lestring]
['Text']
Run Code Online (Sandbox Code Playgroud)
与你的实现相比,虽然LC有一个隐式循环,但它更快,因为没有像你的情况那样的显式函数调用 count
与Joe的实现相比,你的实现更快,因为过滤器函数需要在循环中调用两个函数,lambda并且count
>>> def joe(lelist, lestring):
return ''.join(random.sample(x + 'b'*len(x), len(x)))
>>> def uz(lelist, lestring):
for x in lelist:
if lestring.count(x):
return 'Yep. "%s" contains characters from "%s" item.' % (lestring, x)
>>> def ab(lelist, lestring):
return [e for e in lelist if e in lestring]
>>> t_ab = timeit.Timer("ab(lelist, lestring)", setup="from __main__ import lelist, lestring, ab")
>>> t_uz = timeit.Timer("uz(lelist, lestring)", setup="from __main__ import lelist, lestring, uz")
>>> t_joe = timeit.Timer("joe(lelist, lestring)", setup="from __main__ import lelist, lestring, joe")
>>> t_ab.timeit(100000)
0.09391469893125759
>>> t_uz.timeit(100000)
0.1528471407273173
>>> t_joe.timeit(100000)
1.4272649857800843
Run Code Online (Sandbox Code Playgroud)
对于较短的字符串,Jamie的评论解决方案较慢.这是测试结果
>>> def jamie(lelist, lestring):
return next(itertools.chain((e for e in lelist if e in lestring), (None,))) is not None
>>> t_jamie = timeit.Timer("jamie(lelist, lestring)", setup="from __main__ import lelist, lestring, jamie")
>>> t_jamie.timeit(100000)
0.22237164127909637
Run Code Online (Sandbox Code Playgroud)
如果需要布尔值,对于较短的字符串,只需修改上面的LC表达式即可
[e in lestring for e in lelist if e in lestring]
Run Code Online (Sandbox Code Playgroud)
或者对于更长的字符串,您可以执行以下操作
>>> next(e in lestring for e in lelist if e in lestring)
True
Run Code Online (Sandbox Code Playgroud)
要么
>>> any(e in lestring for e in lelist)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34103 次 |
| 最近记录: |