时间管理
(我愿称之为罗氏时间管理大法,全体起立!)
在计算机科学中我认为有两大领域比较高深,多线程和标杆管理,并且关于后者,Python中提供的精确工具并没有什么帮助。
现如今的算法把重点放在了时间管理的实现上,它解决了内置时间管理没有的两个警告:
测量每秒的调用次数,而非每次调用的耗时。
时间复杂度的经验估量。
我们要意识到一个事实就是,一个好的基准应该是在方法论而非数量级上被定义的。
总结一下,以下是对代码进行基准测试时将会发生的一些事:
每个人在自己电脑上执行得到了不同的结果。
不同的基准下,之前更快的实现反而更慢了。
出示的返回值与你局部测试的结果不同(别慌!这是因为环境改变了,比如:GC、CPU、内存、调用次数等等)。
一个团队花了一周的时间优化发现了一个小故障。
算法实现
import numpy as np
from time import perf_counter
from itertools import combinations
def timeit(fn, fargs, n_range, seconds=5):
print(f'[timeit] {seconds} seconds per N')
# timeit for N
bench = []
for n in n_range:
args = fargs(n)
calls = 0
# benchmark
timer = perf_counter()
while perf_counter() - timer < seconds:
fn(args)
calls += 1
timer = perf_counter() - timer
# results
bench.append([np.e, n, timer / calls])
print(f'[N={n}] {calls / timer:.2f} calls/sec')
# estimate complexity
bench = np.log(bench)
(alpha, beta), *_ = np.linalg.lstsq(bench[:, :2], bench[:, -1])
print(f'estimated O({np.exp(alpha):.3} * N ^ {beta:.3f})')
设置
n_range = [100, 1000, 10000, 100000, 1000000]
def get_array(n):
return np.random.randint(0, n, n)
内置的排序
timeit(sorted, get_array, n_range)
Numpy排序
timeit(np.sort, get_array, n_range)
组合排序
def combinatorial_sort(data):
data = data.copy()
for i, j in combinations(range(len(data)), 2):
if data[i] > data[j]:
data[i], data[j] = data[j], data[i]
return data
n_range = [10, 50, 100, 500, 1000]
timeit(combinatorial_sort, get_array, n_range)
Zain Lau
原创文章 2获赞 1访问量 61
关注
私信
展开阅读全文