- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为性能很重要的应用程序编写代码。我想知道为什么 defaultdict
似乎比 setdefault
更快。
我希望能够使用 setdefault
,主要是因为我不喜欢嵌套的 defaultdict
的打印输出(参见下面的实现)。
在我的代码中,我需要测试 element_id
是否已经是字典的键。
这是我正在测试的两个函数:
def defaultdictfunc(subcases,other_ids,element_ids):
dict_name= defaultdict(lambda: defaultdict(lambda: defaultdict(dict)))
for subcase in subcases:
for other_id in other_ids:
for element_id in element_ids:
if element_id in dict_name[subcase][other_id]:
# error duplicate element_id
pass
else:
dict_name[subcase][other_id][element_id]=0
return dict_name
def setdefaultfunc(subcases,other_ids,element_ids):
dict_name={}
for subcase in subcases:
for other_id in other_ids:
for element_id in element_ids:
if element_id in dict_name.setdefault(subcase,{}).setdefault(other_id,{}):
# error duplicate element_id
pass
else:
dict_name[subcase][other_id][element_id]=0
return dict_name
IPython 输入输出:
In [1]: from numpy.random import randint
In [2]: subcases,other_ids,element_ids=(randint(0,100,100),randint(0,100,100),randint(0,100,100))
In [5]: from collections import defaultdict
In [6]: defaultdictfunc(subcases,other_ids,element_ids)==setdefaultfunc(subcases,other_ids,element_ids)
Out[6]: True
In [7]: %timeit defaultdictfunc(subcases,other_ids,element_ids)
10 loops, best of 3: 177 ms per loop
In [8]: % timeit setdefaultfunc(subcases,other_ids,element_ids)
1 loops, best of 3: 351 ms per loop
为什么 setdefaultfunc
比较慢。我认为底层代码是一样的。有没有办法提高它的速度?
谢谢
最佳答案
根据用户aneroid :
It would make sense that
defaultdict
is faster thatdict.setdefault()
since the former sets its default for the entire dict at creation time, whereas setdefault() does it per element when it is read. One reason to use setdefault is when the default you assign is based on the key (or something) rather than a generic default for the entire dict.
关于python - setdefault 与 defaultdict 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38625608/
我有以下代码片段: mirna2age = {} for i in agesdb: mirna2age.setdefault(i[0],default=[]).append(i[1]) 但是,
TimeZone.setDefault 时区似乎不支持夏令时。如果我保留默认值(不使用函数 setDefault),应用程序将显示 EST/EDT 中的日期。但如果我想更改时区(我使用 TimeZon
给出以下通用代码: def soapQuery(): soapuser = "Base64String" soappass = "Base64String" soapurl =
这个问题已经有答案了: python dict setdefault, confused (3 个回答) 已关闭 6 年前。 有人可以解释一下在下面的情况下如何对字典“inverse”进行赋值吗? d
dict.setdefault 的一个小烦恼是它总是评估它的第二个参数(当然,当给定时),即使第一个参数已经是字典中的键。 例如: import random def noisy_default():
这是来自 Django's authentification models 的一段代码(用户经理): def create_superuser(self, username, email, passw
我的应用程序用户可以从应用程序的设置页面更改应用程序语言,因此我使用 Resources.updateConfiguration() 开发它。和 Context.createConfiguration
这是来自 Django's authentification models 的一段代码(用户经理): def create_superuser(self, username, email, passw
我想在 Java 小程序中进行简单的 HTTP 身份验证,我正在尝试这种方式: static class MyAuthenticator extends Authenticator {
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我从 Automate the boring stuff with Python 一书中得到这段代码,但我不明白 setdefault() 方法如何计算唯一字符的数量。 代码: message = '
我想知道是否有一种方法可以使用类似 lambda 的样式来附加到已排序的字典列表字段中。 示例: a = {} a.setdefault("foo", []).append(2) a.setdefau
这个问题在这里已经有了答案: Python list + list vs. list.append() (2 个答案) 关闭 7 年前。 我有下面的代码,我试图在输入中每次出现时将 1 append
为了说明这个问题,我创建了一个简单的例子: #!/usr/bin/env python class Person(): def __init__(self): self.cac
我一直在寻找一种算法,但我无法弄清楚为什么字典 d 中有值而 curr 中没有。我认为似乎没有对 dict d 做任何事情。 >>> def what(*words): ... d = {}
在 Python 2.5 中添加的 collections.defaultdict 大大减少了对 dict 的 setdefault 方法的需求。这个问题是针对我们的集体教育的: setdefault
我正在寻找一种更好的方法来设置 Java 的默认时区。我们当前正在访问 DB2 数据库以获取其当前时区,但它不是时区名称,只是当前的小时/分钟偏移值。因此,我们采用该值并构造一个类似“GMT-07:0
我正在使用 jQuery timepicker 插件来扩展 jQuery datepicker,它允许我有一个日期+时间选择器。 link to the addon 为了设置格式设置和区域设置等默认设
如果我有这样的声明: INSERT INTO foo (id, name, description, etc_a, etc_b) VALUES (?, ?, ?, ?, ?); 它被传递到 Prepa
使用集合时的常见模式如下: number_list = [1,5,7,2,4,4,1,3,8,5] number_set = set() for number in number_list: #
我是一名优秀的程序员,十分优秀!