队列的数据,是从web应用中添加过来的(上面省略了bottle的代码),开了一个进程,不断从queue中读取数据,并进行处理(省略了处理过程)。
逻辑是没错的,但是在实际测试的时候,发现一个问题。
Queueget()函数是个默认阻塞的函数,如果队列为空,会一直等待,类似于socketrecv。在测试的时候,程序一直卡在这里,也就是说read()函数并没有读到队列中的数据。
既然存有上千万个数据,为什么不使用数据库呢?
使用小型的sqlite数据库,加上适当的索引、筛选,肯定能大大提高数据处理速度。
python也自身带有处理sqlite数据库的模块,极其方便。
用Python 做策略回测,耗时很长,有什么加速办法
少用for,尽量用numpy/pandas的向量化方法。
少用自己写的python方法,先看看numpy /pandas是不是已有现成的功能。
有几个numpy 的加速包,比如numexpr
安装Intel MKL
最后,可以讲关键部分用c/c++实现。
如果无法避开python的for,建议使用Numba来提速,理想情况下可以达到和numpy向量化差不多的速度。
使用timeit模块,先介绍下:
timeit 模块
timeit 模块定义了接受两个参数的 Timer 类。两个参数都是字符串。 第一个参数是你要计时的语句或者函数。 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入语句。 从内部讲, timeit 构建起一个独立的虚拟环境, 手工地执行建立语句,然后手工地编译和执行被计时语句。
一旦有了 Timer 对象,最简单的事就是调用 timeit(),它接受一个参数为每个测试中调用被计时语句的次数,默认为一百万次;返回所耗费的秒数。
Timer 对象的另一个主要方法是 repeat(), 它接受两个可选参数。 第一个参数是重复整个测试的次数,第二个参数是每个测试中调用被计时语句的次数。 两个参数都是可选的,它们的默认值分别是 3 和 1000000。 repeat() 方法返回以秒记录的每个测试循环的耗时列表。Python 有一个方便的 min 函数可以把输入的列表返回成最小值,如: min(trepeat(3, 1000000))
你可以在命令行使用 timeit 模块来测试一个已存在的 Python 程序,而不需要修改代码。
再给你个例子,你就知道怎么做了。
# -- coding: utf-8 --#!/bin/env python
def test1():
n=0
for i in range(101):
n+=i
return n
def test2():
return sum(range(101))
def test3():
return sum(x for x in range(101))
if __name__=='__main__':
from timeit import Timer
t1=Timer("test1()","from __main__ import test1")
t2=Timer("test2()","from __main__ import test2")
t3=Timer("test3()","from __main__ import test3")
print t1timeit(1000000)
print t2timeit(1000000)
print t3timeit(1000000)
print t1repeat(3,1000000)
print t2repeat(3,1000000)
print t3repeat(3,1000000)
以上就是关于Python异步编程全攻略全部的内容,包括:Python异步编程全攻略、一篇文章带你深度解析Python线程和进程、python多进程队列耗时多吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)