罗志祥——时间管理

Olga ·
更新时间:2024-09-21
· 798 次阅读

时间管理
(我愿称之为罗氏时间管理大法,全体起立!)

在计算机科学中我认为有两大领域比较高深,多线程和标杆管理,并且关于后者,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 关注 私信 展开阅读全文
作者:Zain Lau



罗志祥 时间管理

需要 登录 后方可回复, 如果你还没有账号请 注册新账号