从谷爱凌身上,我们看到了支撑她走上神坛的4个因素:
优良的基因
衣食无忧的生活
兴趣自由
智力向导
其中基因是基础,也可以说是最重要的。不要小看基因的一点儿优化,哪怕一丁点的改良就可能超越当前地球在世人类,更别说石头缝中蹦出来的孙悟空几天就能学会翻筋斗,再看看比他多学了多少年的师兄的水平如何?再看看日本的羽生结弦,因为受制于身体极限,一直受困于4A,终究无法突破,也许他缺的就是那么一点儿基因改良。衣食无忧意味着财务自由,可以随心所欲选择自己感兴趣的事情,而无心理包袱,就像羽生结弦已经有了几次卫冕冠军的成就,再多一次,再说一次都无所谓,可以放纵去挑战4A。谷爱凌的生活环境加上精英父母及其生活圈子,相信她可以接触到全世界最优秀的教练、教育和培训,这可以让她避免很多弯路。
一、Dask组成部分
Dask是一款用Python开发的轻量级并行计算库,Dask由两部分组成:
并行数据集合:比如array、dataframes和lists等。它们扩展了NumPy, Pandas 或者 Python iterators接口,能够支持超过内存的数据集处理。
动态任务调度:同Airflow、Luigi和Celery类似,但是专门为计算优化过了,用于交互式计算场景。上述并行数据集合就运行在调度系统之上。
就Dask本身,并行数据集合和动态任务调度构成了其高层和低层视角。Dask 的高层数据集合可以看做 NumPy和Pandas在大数据集下的替代品。Dask低层调度系统提供基于Task Graph的并行动态任务调度,可以看做在复杂计算场景下Python线程或多进程库( threading or multiprocessing )的替代品。总体上,Dask具备以下优点:
熟悉(Familiar):Dask高层提供了并行化版本的NumPy array 和 Pandas DataFrame,但使用方式跟NumPy和Pandas几乎保持不变,开发者使用起来更容易接受
灵活(Flexible):Dask地层提供了任务调度系统接口,方便自定义类型的计算负载和跟其他项目集成
原生(Native):分布式计算使用纯粹的Python实现,能够容易地访问Python数据对象
快速(Fast):数值计算操作低开销、低延迟、低序列化
伸缩(Scalable):支持小到单机单核运算模式,多到上千核的集群运算模式
响应(Responsive):为交互式计算而设计,提供快速反馈和诊断
Task Graph可以看做是高层数据集合跟底层调度的衔接部分,高层数据集合对象 Array、DataFrame和Bag以及delay和future自动将大任务拆分成更小的子任务,并提交到调度系统去执行。不同于Array、DataFrame和Bag,利用delay和future能够实现更复杂的算法。
二、Dask 并行数据集合
1. Array
Array是一个使用分块算法实现了NumPy ndarray的接口子集。
import dask.array as da
x = da.random.random((10000, 10000), chunks=(1000, 1000))
2. Bag
Bag是允许重复的无序集合的数学名称,是multiset的友好代名词。bag或者multiset是set 集合概念的泛化,不像集合set,bag允许重复,作为对比,看几个例子:
list: ordered collection with repeats, [1, 2, 3, 2]
set: unordered collection without repeats, {1, 2, 3}
bag: unordered collection with repeats, {1, 2, 2, 3}
可见,bag跟list很像,但不保证顺序。举个创建bag的简单例子:
import dask.bag as db
>>> b = db.from_sequence([1, 2, 3, 4, 5, 6], npartitions=2)
>>> b
dask.bag<from_sequence, npartitions=2>
Dask Bag在普通Python 对象集合上实现类似map, filter, fold 和groupby这样的操作,就像PySpark RDD那样,使用Bag能够在少量内存上实现并行操作。Dask Bags 常被用于日志文件、JSON格式的记录或其他用户定义的Python对象上的简单预处理,比如下例中处理JSON文件:
import dask.bag as db
import json
b0 = db