python – 将列表转换为字典时的速度问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 将列表转换为字典时的速度问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2813字,纯文字阅读大概需要5分钟。
内容图文
![python – 将列表转换为字典时的速度问题](/upload/InfoBanner/zyjiaocheng/778/431c72135b5f4b1b89db67d48484c865.jpg)
我有一些关于将列表转换为字典的速度问题,其中以下操作占用总运行时间的约90%:
def list2dict(list_):
return_dict = {}
for idx, word in enumerate(list_):
if word in return_dict:
raise ValueError("duplicate string found in list: %s" % (word))
return_dict[word] = idx
return return_dict
我有麻烦看到它究竟是什么导致了这一点.您是否在代码中看到了明显的瓶颈,或者有关如何加快速度的建议?
谢谢.
解决方法:
编辑:
想象一下,我把它放在首位,因为它更大 – 事实证明,对OP代码的一个小调整会给性能带来很大的提升.
def list2dict(list_): # OLD
return_dict = {}
for idx, word in enumerate(list_):
if word in return_dict: # this compare is happening every iteration!
raise ValueError("duplicate string found in list: %s" % (word))
return_dict[word] = idx
return return_dict
def list2dictNEW(list_): #NEW HOTNESS
return_dict = {}
for idx, word in enumerate(list_):
return_dict[word] = idx # overwrite if you want to, because...
if len(return_dict) == len(list_): return return_dict
# if the lengths aren't the same, something got overwritten so we
# won't return. If they ARE the same, toss it back with only one
# compare (rather than n compares in the original
else: raise ValueError("There were duplicates in list {}".format(list_))
DEMO:
>>> timeit(lambda: list2dictNEW(TEST))
1.9117132451798682
>>> timeit(lambda: list2dict(TEST)):
2.2543816669587216
# gains of a third of a second per million iterations!
# that's a 15.2% speed bost
没有明显的答案,但你可以尝试类似的东西:
def list2dict(list_):
return_dict = dict()
for idx,word in enumerate(list_):
return_dict.setdefault(word,idx)
return return_dict
您也可以构建一个set并执行list.index,因为您说列表相当小,但我认为这样会比较慢而不是更快.这需要分析才能确定(使用timeit.timeit)
def list2dict(list_):
set_ = set(list_)
return {word:list_.index(word) for word in set_}
我冒昧地在一组测试数据上运行一些配置文件.结果如下:
TEST = ['a','b','c','d','e','f','g','h','i','j'] # 10 items
def list2dictA(list_): # build set and index word
set_ = set(list_)
return {word:list_.index(word) for word in set_}
def list2dictB(list_): # setdefault over enumerate(list)
return_dict = dict()
for idx,word in enumerate(list_):
return_dict.setdefault(word,idx)
return return_dict
def list2dictC(list_): # dict comp over enumerate(list)
return_dict = {word:idx for idx,word in enumerate(list_)}
if len(return_dict) == len(list_):
return return_dict
else:
raise ValueError("Duplicate string found in list")
def list2dictD(list_): # Original example from Question
return_dict = {}
for idx, word in enumerate(list_):
if word in return_dict:
raise ValueError("duplicate string found in list: %s" % (word))
return_dict[word] = idx
return return_dict
>>> timeit(lambda: list2dictA(TEST))
5.336584700190931
>>> timeit(lambda: list2dictB(TEST))
2.7587691306531
>>> timeit(lambda: list2dictC(TEST))
2.1609074989233292
>>> timeit(lambda: list2dictD(TEST))
2.2543816669587216
内容总结
以上是互联网集市为您收集整理的python – 将列表转换为字典时的速度问题全部内容,希望文章能够帮你解决python – 将列表转换为字典时的速度问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。