我是靠谱客的博主 风中皮卡丘,最近开发中收集的这篇文章主要介绍python 字典 列表 速度_python – 将列表转换为字典时的速度问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我有一些关于将列表转换为字典的速度问题,其中以下操作占用总运行时间的约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 – 将列表转换为字典时的速度问题的全部内容,希望文章能够帮你解决python 字典 列表 速度_python – 将列表转换为字典时的速度问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部