骨挑战套餐
flyingtrain的Python项目详细描述
飞行列车-文档
使用迭代解析器从.txt文件中的长JSON传输列表中检索传输模型和总乘客容量
安装
这个项目是用python 2打包的,可以用pip
安装。复制粘贴并在终端中运行此命令:
pip install flyingtrain
Docker(补充解决方案)
- 此项目也已停靠。Docker需要安装才能在容器化方法中运行此项目。
- Dockerfile使用
python:2
作为基础图像。 - 有一些可行的命令如Makefile,或者简单地执行
make help
,它将显示可以使用的make命令。(稍后我们将详细介绍)
工具
此项目使用ijson作为迭代json解析器,以避免将整个数据文件转储到内存中
用法
安装后,可以在虚拟环境中使用以下代码片段提取数据
importflyingtraintest_file='test.txt'# the full path of the fileflyingtrain.extract_data(test_file)
结果
(flyingtrain) chuhsuan@ubuntu:~/Desktop$ python Python 2.7.12 (default, Nov 122018, 14:36:49)[GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license"for more information. >>> import flyingtrain >>> flyingtrain.extract_data('test.txt')"planes": 524"trains": 150"cars": 14"distinct-cars": 3"distinct-planes": 2"distinct-trains": 1
docker解决方案
将数据文件复制到根文件夹,将文件名分配给main.py
中的test_file,然后执行make run
。卷绑定可以像makefile中的this line那样使用,以避免复制文件,但在这里没有实现,而将docker作为补充解决方案。
Docker解决方案的结果
chuhsuan@ubuntu:~/git/flyingtrain$ make run docker build \ -t chuhsuanlee/flyingtrain \ . Sending build context to Docker daemon 61.44kB Step 1/5 : FROM python:2 ---> 3c43a5d4034a Step 2/5 : WORKDIR /usr/src ---> Using cache ---> 37e4d0e02609 Step 3/5 : COPY requirements.txt /usr/src/ ---> Using cache ---> 85ae12b2a6f6 Step 4/5 : RUN pip install -r requirements.txt ---> Using cache ---> 9d33ec10c044 Step 5/5 : ENTRYPOINT ["python", "main.py"] ---> Using cache ---> e3d261a60154 Successfully built e3d261a60154 Successfully tagged chuhsuanlee/flyingtrain:latest docker run \ --rm -v /etc/localtime:/etc/localtime -v /home/chuhsuan/git/flyingtrain:/usr/src \ chuhsuanlee/flyingtrain "planes": 524"trains": 150"cars": 14"distinct-cars": 3"distinct-planes": 2"distinct-trains": 1
基准
终端中使用以下命令来显示检索数据所需的时间
python -m timeit -s "import flyingtrain""flyingtrain.extract_data('test.txt')"
结果
1000 loops, best of 3: 684 usec per loop
这意味着执行一次大约需要684usec
docker解决方案
将文件名分配给benchmark.py
中的test_file,然后执行make runbenchmark
。同样,这里没有实现卷绑定,因此文件应该放在根文件夹下。
Docker解决方案的结果
[0.6676740646362305, 0.6634271144866943, 0.6310489177703857]
这意味着用3次重复计数和1000次执行计数来测量执行时间。平均每次执行需要654 usec
可能的优化
- 首先,对于benchmarking,这里使用内置模块
timeit
。还可以使用一些第三方包(如memory_profiler)来监视进程的内存消耗以及逐行分析。 - 其次,当记录量增加,并且不同传输的模型集不断增加时,如果我们仍然天真地为周围的每个模型保留一组计数,则可能会占用大量内存和CPU。这里有流近似算法,如HyperLogLog。
- 最后但并非最不重要的是,数据集的格式。Protocol buffers和recordio,甚至Cap'n Proto都是一个很好的尝试。它是一种二进制存储格式,解析速度更快,并且能够抵御损坏。(记录文件是校验和,可以跳过损坏的部分而不丢失整个文件)