为什么以下在Python中出现意外行为?
>>> a = 256
>>> b = 256
>>> a is b
True # This is an expected result
>>> a = 257
>>> b = 257
>>> a is b
False # What happened here? Why is this False?
>>> 257 is 257
True # Yet the literal numbers compare properly
Run Code Online (Sandbox Code Playgroud)
我使用的是Python 2.5.2.尝试一些不同版本的Python,似乎Python 2.3.3显示了99到100之间的上述行为.
基于以上所述,我可以假设Python在内部实现,使得"小"整数以不同于大整数的方式存储,is运算符可以区分.为什么泄漏抽象?当我不知道它们是否是数字时,比较两个任意对象以查看它们是否相同的更好的方法是什么?
复制洗牌range(10**6)清单十次需要大约0.18秒:(这是五次运行)
0.175597017661
0.173731403198
0.178601711594
0.180330912952
0.180811964451
Run Code Online (Sandbox Code Playgroud)
将未洗牌的列表复制十次需要大约0.05秒:
0.058402235973
0.0505464636856
0.0509734306934
0.0526022752744
0.0513324916184
Run Code Online (Sandbox Code Playgroud)
这是我的测试代码:
from timeit import timeit
import random
a = range(10**6)
random.shuffle(a) # Remove this for the second test.
a = list(a) # Just an attempt to "normalize" the list.
for _ in range(5):
print timeit(lambda: list(a), number=10)
Run Code Online (Sandbox Code Playgroud)
我也尝试过复制a[:],结果相似(即速度差异很大)
为什么速度差异很大?我知道并理解着名的速度差异为什么处理排序数组比未排序数组更快?例如,但在这里我的处理没有决定.它只是盲目地复制列表中的引用,不是吗?
我在Windows 10上使用Python 2.7.12.
编辑:现在尝试使用Python 3.5.2,结果几乎相同(在0.17秒内一直洗牌,在0.05秒内一直未洗牌).这是代码:
a = list(range(10**6))
random.shuffle(a)
a = list(a)
for _ in range(5):
print(timeit(lambda: list(a), number=10))
Run Code Online (Sandbox Code Playgroud) 我记得假设在我的架构类中L1缓存命中是1个周期(即与寄存器访问时间相同),但在现代x86处理器上实际上是这样吗?
L1缓存命中多少个周期?它与寄存器访问相比如何?
performance x86 cpu-architecture micro-optimization cpu-cache
我尝试通过迭代整数列表来在 python 中进行快速字典查找。我注意到无序查找比有序查找慢大约 10 倍。
有什么方法可以加快无序字典查找速度吗?您知道造成时差的原因吗?在我的原始数据中,条目不是有序的或连续的,因为并非某个范围内的所有整数都在我的列表中。
我做了什么:
dummy_dict = {i:i for i in range(10000000)}
#Ordered list
a = [i for i in range(10000000)]
#Unordered list
b = [i for i in range(10000000)]
random.shuffle(b)
#Sorted unordered list
c = b[:]
c.sort()
Run Code Online (Sandbox Code Playgroud)
跑步时间:
[dummy_dict[i] for i in a] #Time to run: 0.7s
[dummy_dict[i] for i in b] #Time to run: 6.7s
[dummy_dict[i] for i in c] #Time to run: 0.7s
Run Code Online (Sandbox Code Playgroud)
不仅进行字典查找速度较慢,而且迭代列表的时间也不同:
["" for i in a] #Time to run: 0.3s
["" for …Run Code Online (Sandbox Code Playgroud) python ×3
performance ×2
cpu-cache ×1
dictionary ×1
identity ×1
int ×1
list ×1
lookup ×1
operators ×1
x86 ×1