f**********d 发帖数: 4960 | 1 想用timeit测量一个dictionary读取速度。
timeit.Timer('d[key]')总是报错说不认识d.d是我程序中定义的字典。
有人搞过这个么? |
|
j********x 发帖数: 2330 | 2 来自主题: Programming版 - 转一篇范文 我们来比较一下三种写法,我来阐述一下为什么 A最好,C最烂。
A. 初始化成[]然后“笨拙地”逐个append/extend
B. list(chain(*d.iteritems()))
C. list(sum(d.items(),()))
首先,跟 B 和 C 这样的 one liner 相比,A 这种看起来最“笨拙”、
似乎不怎么 "idiomatic" 的写法,实际上理解起来最容易,
几乎没有什么沟通成本和心智负担。
当然 itertools.chain 也是比较直观的,心智负担也不大。
而 sum(d.items(),()) 的问题,首先在于你要意识到 sum 函数第二个参数的存在,
而且这个参数的默认值是整数0,而不是 None, '', (), [], {} 或 set()。
这给大多数阅读代码的人带来了心智负担,降低了理解速度。
其次,我们来看看执行效率。
下面 benchmark 结果显示,在原 dict 稍大时,
裸写 []-extend 最快,chain 稍次之,sum 则完全不能忍受
——因为累加过程中无谓地生成了很多临时tuples,... 阅读全帖 |
|
t****a 发帖数: 1212 | 3 顺便测试了一下python做fib的性能(single thread)
def fib(n):
if n < 2:
return(n)
else:
return(fib(n-1)+fib(n-2))
import timeit
print timeit.timeit("fib(36)", number=1, setup="from __main__ import fib")
速度大约是clojure single thread的10% |
|
a****e 发帖数: 9589 | 4 最先想到re,然后是mod(%),range 想的妙(佩服),textwrap 从未接触过(学习
了),其他的从直觉上觉得效率不高,pass了。
写了个测试程序如下:
import timeit
s = "0001001101111111"
def mtimeit(func):
def wrap(*args, **kwargs):
t = timeit.Timer(func)
print func.func_name,
print min(t.repeat(number=1))
return func
return wrap
@mtimeit
def re_func():
import re
return '-'.join(re.findall('\d{4}', s))
@mtimeit
def mod_func():
return ''.join(x if i%4 or i==0 else '-'+x for i,x in enumerate(s))
@mtimeit
de... 阅读全帖 |
|
x******a 发帖数: 6336 | 5 我有一个MultiIndex的pandas DataFrame df
df.shape=(3000, 800)
1. %timeit df.groupby(level=['a','b']).aggregate(scipy.stats.nanmedian)
的结果是best of 3: 39.9 s per loop
2. %timeit df.groupby(level=['a', 'b']).median()
的结果是best of 3: 113 ms per loop
差了大概400倍。
我想要用一个自己定义的函数winsorized_mean.试了第一种,best of 3: 1 min 41s
per loop.请问可以怎么改进?
多谢! |
|
m********5 发帖数: 17667 | 6 因为import, dot操作等消耗的时间远超过其他步骤
所以我觉得有必要修改一下,直接把reptfda用在测试func中
import re
rept=re.compile('\d{4}')
reptfda=rept.findall
为了 eliminate global var lookup overhead 的影响,应该多尝试几次 number=1应
该是不行的。
修改了一下:
def testAthome2(s,niter):
import re
rept=re.compile('\d{4}')
reptfda=rept.findall
def mtimeit(func):
def wrap(*args, **kwargs):
t = timeit.Timer(func)
print func.func_name,
print min(t.repeat(number=niter))
return func
return ... 阅读全帖 |
|
m********2 发帖数: 89 | 7 "200多m的dic" 是只200 million k-v entries ? 才用1.45g内存 ? 不可能吧? 平均
一个k-v entry才不到 8 bytes ?
在我的x230, 16GB mem 上跑 200 million entries dict 会 page reclaim thrashing.
跑 100 million entries 的 dict 没问题:
# t.py
def t(n):
d = { i:i for i in range(n) }
print( hex(d[n-1]) )
python3 -m timeit -n 2 -r 1 -s 'import t' 't.t(100*2**20)'
2 loops, best of 1: 10.7 sec per loop
今天有点但疼:) |
|
|
|