【发布时间】:2012-06-04 13:15:22
【问题描述】:
我遇到了一个问题,我必须通过代理日志查看用户是否访问过网站列表。
我编写了一个小脚本来读取所有代理日志,将访问的主机与列表进行匹配:
for proxyfile in proxyfiles:
for line in proxyfile.readlines():
if line[4] in hosts_list:
print line
hosts_file 很大,我们正在讨论大约 10000 个主机,我注意到搜索花费的时间比预期的要长。
我写了一个小测试:
import random, time
test_list = [x for x in range(10000)]
test_dict = dict(zip(test_list, [True for x in range(10000)]))
def test(test_obj):
s_time = time.time()
for i in range(10000):
random.randint(0,10000) in test_obj
d_time = time.time() - s_time
return d_time
print "list:", test(test_list)
print "dict:",test(test_dict)
结果如下:
list: 5.58524107933
dict: 0.195574045181
所以,我的问题。 是否可以以更方便的方式执行此搜索?创建列表的字典似乎是一种 hack,因为我想搜索它们的键而不是它包含的值。
【问题讨论】:
-
在测试代码的 sn-ps 时,您可以使用 timeit module 而不是自己制作。 (如果你使用 ipython 会更容易。)
-
您需要在时间观察中包含 generating dict。
-
你可以使用集合。
-
@Martijn Pieters,list->dict 转换只进行一次,之后使用了数百万次。一遍又一遍地创建字典是不现实的。
-
您可以使用
dict.fromkeys(test_list, True),或者在这种情况下使用set,而不是dict(zip(test_list, [True for x in range(10000)]))。
标签: python search optimization python-2.2