- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在包含 50 个项目的 Python 字典中,匹配整数键(2 位数字)查找字符串值与匹配字符串键(5 - 10+ 个字母)查找整数值之间是否存在已知的明显速度差异大量循环(100,000+)?
作为一个小奖励;如果可以的话,在 MYSQL 中执行此类事件与在 Python 中执行此类事件有什么好处吗?
最佳答案
微基准测试语言features 是一个有用的练习,但你必须将它与一粒盐。很难做到以准确且有意义的方式进行基准测试,并且通常人们关心的是整体表现,而不是个人特征性能。
我发现使用“测试工具”可以更轻松地运行以可比较的方式选择不同的替代方案。
对于字典查找,以下是使用 benchmark 的示例来自 PyPI 的模块。100随机运行,设置 N=50 个项目的 dict
每个 - int
键和 str
值或相反,然后尝试 try
/ except
和 get
访问范例。代码如下:
import benchmark
from random import choice, randint
import string
def str_key(length=8, alphabet=string.ascii_letters):
return ''.join(choice(alphabet) for _ in xrange(length))
def int_key(min=10, max=99):
return randint(min, max)
class Benchmark_DictLookup(benchmark.Benchmark):
each = 100 # allows for differing number of runs
def setUp(self):
# Only using setUp in order to subclass later
# Can also specify tearDown, eachSetUp, and eachTearDown
self.size = 1000000
self.n = 50
self.intdict = { int_key():str_key() for _ in xrange(self.n) }
self.strdict = { str_key():int_key() for _ in xrange(self.n) }
self.intkeys = [ int_key() for _ in xrange(self.size) ]
self.strkeys = [ str_key() for _ in xrange(self.size) ]
def test_int_lookup(self):
d = self.intdict
for key in self.intkeys:
try:
d[key]
except KeyError:
pass
def test_int_lookup_get(self):
d = self.intdict
for key in self.intkeys:
d.get(key, None)
def test_str_lookup(self):
d = self.strdict
for key in self.strkeys:
try:
d[key]
except KeyError:
pass
def test_str_lookup_get(self):
d = self.strdict
for key in self.strkeys:
d.get(key, None)
class Benchmark_Hashing(benchmark.Benchmark):
each = 100 # allows for differing number of runs
def setUp(self):
# Only using setUp in order to subclass later
# Can also specify tearDown, eachSetUp, and eachTearDown
self.size = 100000
self.intkeys = [ int_key() for _ in xrange(self.size) ]
self.strkeys = [ str_key() for _ in xrange(self.size) ]
def test_int_hash(self):
for key in self.intkeys:
id(key)
def test_str_hash(self):
for key in self.strkeys:
id(key)
if __name__ == '__main__':
benchmark.main(format="markdown", numberFormat="%.4g")
结果:
$ python dictspeed.py
Benchmark Report
================
Benchmark DictLookup
--------------------
name | rank | runs | mean | sd | timesBaseline
---------------|------|------|--------|---------|--------------
int lookup get | 1 | 100 | 0.1756 | 0.01619 | 1.0
str lookup get | 2 | 100 | 0.1859 | 0.01477 | 1.05832996073
int lookup | 3 | 100 | 0.5236 | 0.03935 | 2.98143047487
str lookup | 4 | 100 | 0.8168 | 0.04961 | 4.65108861267
Benchmark Hashing
-----------------
name | rank | runs | mean | sd | timesBaseline
---------|------|------|----------|-----------|--------------
int hash | 1 | 100 | 0.008738 | 0.000489 | 1.0
str hash | 2 | 100 | 0.008925 | 0.0002952 | 1.02137781609
Each of the above 600 runs were run in random, non-consecutive order by
`benchmark` v0.1.5 (http://jspi.es/benchmark) with Python 2.7.5
Darwin-13.4.0-x86_64 on 2014-10-28 19:23:01.
结论:字典中的字符串查找并不比整数查找昂贵多少。 但是所谓的Pythonic“请求宽恕而不是许可”范例比简单地使用get
方法调用花费的时间长长。此外,散列一个字符串(至少大小为 8)并不比散列一个整数昂贵多少。
但是如果您在不同的实现上运行,例如 PyPy,事情会变得更加有趣:
$ pypy dictspeed.py
Benchmark Report
================
Benchmark DictLookup
--------------------
name | rank | runs | mean | sd | timesBaseline
---------------|------|------|---------|-----------|--------------
int lookup get | 1 | 100 | 0.01538 | 0.0004682 | 1.0
str lookup get | 2 | 100 | 0.01993 | 0.001117 | 1.295460397
str lookup | 3 | 100 | 0.0203 | 0.001566 | 1.31997704025
int lookup | 4 | 100 | 0.02316 | 0.001056 | 1.50543635375
Benchmark Hashing
-----------------
name | rank | runs | mean | sd | timesBaseline
---------|------|------|-----------|-----------|--------------
str hash | 1 | 100 | 0.0005657 | 0.0001609 | 1.0
int hash | 2 | 100 | 0.006066 | 0.0005283 | 10.724346492
Each of the above 600 runs were run in random, non-consecutive order by
`benchmark` v0.1.5 (http://jspi.es/benchmark) with Python 2.7.8
Darwin-13.4.0-x86_64 on 2014-10-28 19:23:57.
在最好的情况下,PyPy 的速度大约快 11 倍,但比率有很大不同。 PyPy 不会像 CPython 那样承受巨大的异常处理成本。而且,对整数进行哈希处理的速度比对字符串进行哈希处理的速度慢 10 倍。想要得到意想不到的结果怎么样?
我本来想尝试 Python 3,但是 benchmark
在那里安装得不好。我还尝试将字符串长度增加到 50。它并没有显着改变结果、比率或结论。
总体而言,散列和查找速度非常快,除非您必须执行数百万或数十亿次,或者有非常长的 key ,或者其他一些不寻常的情况,否则开发人员通常不需要担心它们的微观性能。
关于Python 字典 : there a speed difference between matching a numeric key over a word in python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26615595/
好吧,我是编程新手,我想知道如何打印某些字段的值。例如,我有一个速度,单位是节(21 节),如何将“节”部分添加到我的代码中,这样我就不会只打印整数?我希望它有 [number] 节。这是我到目前为止
我正在研究堆算法。 我认为堆算法作为函数会比纯代码慢。 所以我做了一个测试。但我发现函数式代码比纯代码快得多。 我觉得这很奇怪,我不知道为什么。 enter image description her
除了明确的清晰度,我们为什么要坚持:car.getSpeed()和 car.setSpeed(55)当这也可以使用时:car.speed()和 car.speed(55) 我知道 get() 和 se
我正在尝试实现 google speed limit API 来计算从一个位置到另一个位置所需的最低速度。但是当我在浏览器中运行时出现以下错误。 谁能帮我解决这个问题?谢谢 "error": {
我正在创建一个 LAN 速度测试,它在指定位置创建一个指定大小的数据文件,并记录创建/读取它的速度。在大多数情况下,这是正常工作的,只有一个问题:读取速度快得离谱,因为它所做的只是计算文件打开所需的时
我有以下函数,它会为生成的每个订单项调用。有谁知道如何加快速度? private String getDetails(String doc){ String table=""; jav
我正在尝试使用 C#、sdl.net 开发一个简单的 2d 赛车游戏(自上而下查看)。现在,我正在尝试管理我的车的速度、加速度和刹车。我的问题是算法。我的循环 (Events_Tick) 每秒执行 5
我正在读取一个包含 500000 行的文件。我正在测试多线程如何加速进程.... private void multiThreadRead(int num){ for(int i=1; i"+
Java Robot 类允许移动鼠标,就好像移动了实际的物理鼠标一样。 但是,如何以人性化(而非即时)的方式将鼠标从 Point1 移动到 Point2?也就是说,如何设置移动速度? 如果Robot类
我无法找到有关此主题的现有答案。 我正在运行一个连接到远程 redis 服务器(不在同一主机上)的 redis 客户端。 我可以通过域名或服务器的 IP 连接,即我可以通过 redis-cli -h
我正在尝试将 GPS 功能添加到我的 iPhone 应用程序中。这是一款在步行或运行时使用的锻炼应用程序。所以我想使用 GPS 来显示人的移动速度(以英里/小时和分钟/英里为单位)。 我应该如何配置
所以我有一个以“速度”移动的对象,现在我设置了代码,当该对象与另一个对象碰撞时,该对象的速度会降低。我尝试通过改变速度来实现这一点,当速度在 3 秒后改变时,将其改回原来的速度。 这是我自己尝试过的,
这是我的 table : CREATE TABLE `tab_adasf` ( `adasf_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
我正在寻找一种加速文件加载的方法: 数据包含约100万行,制表符以“\t”(tabulation char)分隔,utf8编码,使用以下代码解析完整文件大约需要9秒。但是,我希望几乎是一秒钟! def
我创建了一个 python 程序,该程序使用 ArcGIS 的“CostPath”函数在 shapefile“selected_patches.shp”中包含的几个多边形之间自动构建最低成本路径
我有 36 个人和 6 张 table 。我想围绕每张 table 组成 6 个小组。然后再组成 6 个其他组,再组成 6 个其他组……直到每个人都遇到每个人,但没有人遇到两次。 到目前为止,我想出了
我正在努力提高我的 Google Page Speed 得分。目前移动设备为 51/100,桌面设备为 83/100。 其中一个问题是“消除首屏内容中阻止渲染的 JavaScript 和 CSS”。适
所以我在几个小时内一直在寻找为什么我的 iPhone 应用程序讨厌我。这是我得到的错误:警告:“speedView”的局部声明隐藏了实例变量。这是我的 .m 文件 @implementation Ma
我最近做了一个网站,但加载速度很慢。我的 Firebug 页面速度得分是 82/100。我觉得这很好。我的网站有 2 个图像,它们有 100KB 和一些其他小图像,用于子弹、箭头和不超过 50KB 的
我正在用 python 构建词形还原器。因为我需要它实时运行/处理相当大量的数据,所以处理速度是最重要的。数据:我有所有可能的后缀,这些后缀链接到它们可以组合的所有词类型。此外,我还有与其词型和引理相
我是一名优秀的程序员,十分优秀!