def main():
for i in xrange(10**8):
pass
main()
Run Code Online (Sandbox Code Playgroud)
Python中的这段代码运行(注意:时序是在Linux中的BASH中使用时间函数完成的.)
real 0m1.841s
user 0m1.828s
sys 0m0.012s
Run Code Online (Sandbox Code Playgroud)
但是,如果for循环没有放在函数中,
for i in xrange(10**8):
pass
Run Code Online (Sandbox Code Playgroud)
然后它会运行更长的时间:
real 0m4.543s
user 0m4.524s
sys 0m0.012s
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我一直听到很多关于PyPy项目的消息.他们声称它比他们网站上的CPython解释器快6.3倍.
每当我们谈论像Python这样的动态语言时,速度是最重要的问题之一.为了解决这个问题,他们说PyPy的速度要快6.3倍.
第二个问题是并行性,臭名昭着的全球口译锁(GIL).为此,PyPy表示它可以提供无GIL的Python.
如果PyPy可以解决这些巨大的挑战,它的弱点是什么阻碍了更广泛的采用?也就是说,什么阻止像我这样的人,一个典型的Python开发人员,现在切换到PyPy ?
什么是关于Python和CPython (Jython,IronPython)的所有这些大惊小怪,我不明白:
python.org提到CPython是:
Python的"传统"实现(绰号CPython)
CPython是Python的默认字节码解释器,用C语言编写.
老实说,我没有得到这两个解释实际上意味着什么,但我认为,如果我使用CPython,这意味着当我运行示例python代码时,它将它编译为C语言,然后执行它就好像它是C码
那么CPython究竟是什么呢?与python相比它有何不同?我是否应该使用CPython而不是Python,如果有的话,它有什么优势呢?
将浮点数与整数进行比较时,某些值对的评估时间比其他类似值的值要长得多.
例如:
>>> import timeit
>>> timeit.timeit("562949953420000.7 < 562949953421000") # run 1 million times
0.5387085462592742
Run Code Online (Sandbox Code Playgroud)
但是如果浮点数或整数变小或变大一定量,则比较运行得更快:
>>> timeit.timeit("562949953420000.7 < 562949953422000") # integer increased by 1000
0.1481498428446173
>>> timeit.timeit("562949953423001.8 < 562949953421000") # float increased by 3001.1
0.1459577925548956
Run Code Online (Sandbox Code Playgroud)
更改比较运算符(例如,使用==
或>
替代)不会以任何明显的方式影响时间.
这并不仅仅与幅度有关,因为选择更大或更小的值可以导致更快的比较,因此我怀疑它是由于位排列的一些不幸的方式.
显然,对于大多数用例来说,比较这些值的速度要快得多.我只是好奇为什么Python似乎更多地使用一些值而不是其他值.
Apparently list(a)
doesn't overallocate, [x for x in a]
overallocates at some points, and [*a]
overallocates all the time?
Here are sizes n from 0 to 12 and the resulting sizes in bytes for the three methods:
0 56 56 56
1 64 88 88
2 72 88 96
3 80 88 104
4 88 88 112
5 96 120 120
6 104 120 128
7 112 120 136
8 120 120 152
9 128 184 184
10 136 …
Run Code Online (Sandbox Code Playgroud) 我见过有人说set
python 中的对象有O(1)成员资格检查.它们如何在内部实施以实现这一目标?它使用什么样的数据结构?该实施还有哪些其他含义?
这里的每个答案都很有启发性,但我只能接受一个,所以我会用最接近我原来问题的答案.谢谢你的信息!
我正在玩timeit并注意到对一个小字符串做一个简单的列表理解比在一个小的单个字符串列表上做同样的操作要花费更长的时间.任何解释?这几乎是1.35倍的时间.
>>> from timeit import timeit
>>> timeit("[x for x in 'abc']")
2.0691067844831528
>>> timeit("[x for x in ['a', 'b', 'c']]")
1.5286479570345861
Run Code Online (Sandbox Code Playgroud)
在较低的水平上发生了什么导致这种情况?
可能重复:
Python"is"运算符使用整数意外运行
今天我试着调试我的项目,经过几个小时的分析,我得到了这个:
>>> (0-6) is -6
False
Run Code Online (Sandbox Code Playgroud)
但,
>>> (0-5) is -5
True
Run Code Online (Sandbox Code Playgroud)
你能解释一下,为什么?也许这是某种错误或非常奇怪的行为.
> Python 2.7.3 (default, Apr 24 2012, 00:00:54) [GCC 4.7.0 20120414 (prerelease)] on linux2
>>> type(0-6)
<type 'int'>
>>> type(-6)
<type 'int'>
>>> type((0-6) is -6)
<type 'bool'>
>>>
Run Code Online (Sandbox Code Playgroud) Pythonint
是封装实际数值的对象。我们可以修改这个值吗,例如将对象的值设置1
为 2?那么这就1 == 2
变成了True
?
鉴于比雷埃夫斯对另一个问题的回答,我们有这个
x = tuple(set([1, "a", "b", "c", "z", "f"]))
y = tuple(set(["a", "b", "c", "z", "f", 1]))
print(x == y)
Run Code Online (Sandbox Code Playgroud)
True
在启用哈希随机化的情况下打印大约85%的时间.为什么85%?
cpython ×10
python ×10
performance ×4
set ×2
benchmarking ×1
debugging ×1
hash ×1
integer ×1
jit ×1
list ×1
profiling ×1
pypy ×1
python-3.x ×1
timeit ×1