对于最小循环,Python 3的枚举速度似乎比Python 2慢得多,而对于新版本的Python 3来说,Python 3的枚举速度似乎越来越差。
我在64位Windows机器(英特尔i7-2700K-3.5 GHz)上安装了Python 2.7.6,Python 3.3.3和Python
3.4.0,同时安装了每个Python的32位和64位版本。虽然在内存访问限制的范围内,给定版本在32位和64位之间的执行速度没有显着差异,但不同版本级别之间却存在非常显着的差异。我将让计时结果说明一切:
C:\**Python34_64**\python -mtimeit -n 5 -r 2 -s"cnt = 0" "for i in range(10000000): cnt += 1"
5 loops, best of 2: **900 msec** per loop
C:\**Python33_64**\python -mtimeit -n 5 -r 2 -s"cnt = 0" "for i in range(10000000): cnt += 1"
5 loops, best of 2: **820 msec** per loop
C:\**Python27_64**\python -mtimeit -n 5 -r 2 -s"cnt = 0" "for i in range(10000000): cnt += 1"
5 loops, best of 2: **480 msec** per loop
由于Python 3的“范围”与Python 2的“范围”不同,并且在功能上与Python 2的“ xrange”相同,因此我还按如下方式进行计时:
C:\**Python27_64**\python -mtimeit -n 5 -r 2 -s"cnt = 0" "for i in **xrange**(10000000): cnt += 1"
5 loops, best of 2: **320 msec** per loop
可以很容易地看出3.3版的速度几乎是2.7版的两倍,而Python 3.4的速度却比2.7版慢了约10%。
我的问题:是否有环境选项或设置可以纠正此问题,或者仅仅是效率低下的代码或解释器为Python 3版本做的更多?
答案似乎是,Python 3使用了“无限精度”整数,该整数在Python 2.x中曾被称为“ long”,其默认值为“ int”类型,而没有使用Python
2固定位长“ int”的任何选择,并且正是这些可变长度“ int”的处理花费了额外的时间,如下面的答案和注释中所述。
可能是Python 3.4比Python
3.3慢一些,原因是为了支持同步而对html" target="_blank">内存分配进行了更改,从而使内存分配/重新分配稍微变慢了,这可能是当前“长”处理版本运行速度较慢的主要原因。
差异是由于int
用long
类型替换了类型。显然,使用长整数的long
运算将变慢,因为运算更加复杂。
如果您通过设置强制python2到使用多头cnt
来0L
区别消失:
$python2 -mtimeit -n5 -r2 -s"cnt=0L" "for i in range(10000000): cnt += 1L"
5 loops, best of 2: 1.1 sec per loop
$python3 -mtimeit -n5 -r2 -s"cnt=0" "for i in range(10000000): cnt += 1"
5 loops, best of 2: 686 msec per loop
$python2 -mtimeit -n5 -r2 -s"cnt=0L" "for i in xrange(10000000): cnt += 1L"
5 loops, best of 2: 714 msec per loop
正如您在我的机器上看到的那样,使用range
和xrange
使用long
s时python3.4都比python2更快。python
2的最后一个基准测试xrange
表明,这种情况下的差异很小。
我没有安装python3.3,因此无法在3.3和3.4之间进行比较,但是据我所知,这两个版本之间没有任何重大变化(关于range
),因此时间应该大致相同。如果发现明显差异,请尝试使用dis
模块检查生成的字节码。内存分配器发生了变化(PEP
445),但我不知道是否对默认内存分配器进行了修改,以及从性能角度来看有哪些后果。
因为枚举成员不是有序的,所以它们只支持通过标识(identity) 和相等性 (equality) 进行比较。下面来看看 == 和 is 的使用: #!/usr/bin/env python3 # -*- coding: UTF-8 -*- from enum import Enum class User(Enum): Twowater = 98 Liangdianshui
我在类构造函数中包含一个枚举。类中的该字段在新实例中为空。 我直接设置了枚举值。之后我打印类字段。它是空的。 预期:user.gender打印Genders.OTHER 实际:user.gender打印为空
这显然是一个简化的代码块;我实际上使用的是OIS输入库(http://sourceforge.net/projects/wgois/),因此有关上下文,请参阅此处的完整源代码: http://wgois.svn.sourceforge.net/viewvc/wgois/ois/trunk/src/win32/win32InputManager.cpp?revision=39&view=markup
实现后缀计算器,需要检查运算符的优先级是否低于另一个运算符。以下是我到目前为止所拥有的: 我尝试了许多不同的方法来检查传入的字符的优先级,但都没有用。有没有简单的方法来比较一个枚举的两个值?我需要创建一个循环吗?
问题:给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。 您可以假设每个输入都有一个精确的解决方案,并且您可以不使用相同的元素两次。 例子: 给定nums=[2,7,11,15],target=9, 因为Nums[0]Nums[1]=2 7=9,返回[0,1]。 使用for循环后,我无法理解这些步骤。我是Python新手,请有人帮助我。
问题内容: 有没有办法检查一个枚举值是否大于或等于另一个值? 我想检查错误级别是否为“错误或以上”。 问题答案: 所有Java枚举都实现可比较:http : //java.sun.com/javase/6/docs/api/java/lang/Enum.html 您也可以使用该方法将它们转换为s,然后比较就很简单了。