Python:在枚举中查找字符串的最快方法

Edu*_*scu 4 python string search enumeration python-2.7

解析了IANA子标签(参见级联字符串拆分,pythonic方式)并列出了8600个标签:

tags= ['aa',
       'ab',
       'ae',
       'af',
       'ak',
       'am',
       'an',
       'ar',
       # ...
Run Code Online (Sandbox Code Playgroud)

我想检查一下mytag="ro"列表中是否有:最快的方法是:

第一解决方案

if mytag in tags:
    print "found"
Run Code Online (Sandbox Code Playgroud)

二解决方案:

if mytag in Set(tags):
    print "found"
Run Code Online (Sandbox Code Playgroud)

第三种解决方案:将列表转换为大字符串,如:'|aa|ab|ae|af|ak|am|an|ar|...'然后查看字符串是否在另一个字符串中:

tags = '|aa|ab|ae|af|ak|am|an|ar|...'
if mytag in tags:
    print "found"
Run Code Online (Sandbox Code Playgroud)

还有另外一种方法吗?哪个是最快的,这是否已经测量过,如果不是我怎么能自我测量(我从列表中取一个随机元素,或者我应该拿最后一个然后测试它,有人可以为'天文台'提供python代码)吗?

Pie*_* GM 6

由于我无法访问原始字符串,因此任何测试都会有偏差.但是,你问了一个天文台?检查timeit模块,旨在计算一些代码片段.

请注意,如果您使用IPython,%timeit则是一个神奇的函数,可以轻松地执行函数,如下所示.

一些评论

  • 你应该替换Setset......
  • set在运行任何测试之前构造你的长字符串
  • tags列表中取一个随机元素是真正的方法.

作为%timeit在IPython 中使用的一个例子:

tags = ['aa','ab','ae','af','ak','an','ar']
tags_set = set(tags)
tags_str = "|".join(tags)

%timeit 'ro' in tags
1000000 loops, best of 3: 223 ns per loop
%timeit 'ro' in tags_set
1000000 loops, best of 3: 73.5 ns per loop
%timeit 'ro' in tags_str
1000000 loops, best of 3: 98.1 ns per loop
Run Code Online (Sandbox Code Playgroud)