罗志祥——时间管理

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

   在计算机科学中我认为有两大领域比较高深,多线程和标杆管理,并且关于后者,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)

猜你喜欢

转载自blog.csdn.net/weixin_44659309/article/details/105922805