key python_Python是'key in dict'不同于'key in dict.keys()'

简短回答:在python 2中:您的假设是正确的:dict.keys()速度减慢。

在python 3中:您的假设不正确:in dict.keys()的执行方式类似于in dict

下面是py2和py3的详细信息。

Python 2.7答案:

您的假设是正确的,原因如下:dict.keys()涉及额外的函数调用(堆栈开销)。

dict.keys()返回一个列表,其中包含内存中的所有键(与惰性生成器对象相反)。因此它需要分配内存。

key in dict可以在内部使用set对象,这是索引查找。key in dict.keys()是列表中的线性搜索

我创建了一个小的benckmark脚本来表明我的观点:#! /usr/bin/python2.7

import datetime as dt

import random

dict_size = 1000000

num_iterations = 100

d = {i: i for i in xrange(dict_size)}

def f():

k = random.randint(0,dict_size-1)

return (k in d)

def g():

k = random.randint(0,dict_size-1)

return (k in d.keys())

def test(func):

t = dt.datetime.utcnow()

for i in xrange(num_iterations):

func()

print "%s --> %1.6f s" % (func, (dt.datetime.utcnow()-t).total_seconds())

test(f)

test(g)

输出(python 2.7.6 Ubuntu 14.04): --> 0.000598 s

--> 5.191553 s

我还测试了迭代次数和交换的dict大小(dict只有100个条目,一百万次迭代)。 --> 3.614162 s

--> 7.007922 s

这里的结果更接近。

因此,性能差异确实随着dict的大小而增大

Python 3答案:

我改编了python 3的脚本:xrange已不存在,请改用range。(不在测试功能的性能关键内环中,因此对性能的影响有限)

对print使用大括号

将沙邦线改为#!/usr/bin/python3

并在同一台机器上用Python3.4.3进行了测试。dict_size=1000000;num_iterations=100

f-->0.000590秒

g-->0.000565秒

dict_size=100;num_iterations=1000000

f-->4.525487秒

g-->4.837232秒

所以在python 3中,性能差异消失了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值