Python Flask 代码执行效率问题

vianvio · 2015年03月24日 · 最后由 michael 回复于 2015年07月05日 · 8492 次阅读

近期刚开始用 flask,所以遇到些奇怪问题想请教一下。

从别人那里拿到了数据分析的代码,直接 console 里运行.py 文件的情况下,运行时间在 1~2 秒 而我将这段代码放到 flask 里,写了一个路由,间接执行这段代码的时候,运行时间是之前的 6~10 倍。。。

为了确保执行情况一致,我将用到的数据 hardcode 在代码中,并且在 flask 的 service 调用时,用 multiprocess 新建了一个单独进程去跑,结果还是相差 6~10 倍。

我有将时间 log 打在最耗时的代码前后,发现直接 python xxx.py 的运行情况下耗时在 15000mircoseconds 左右,而通过 service,会高出 10 倍到 20 倍。

单独开进程跑的情况下应该已经将 flask 框架相关的影响去除了吧?感觉理论上应该和 console 里执行是一样的,可是为什么还是差那么多? 还请高手指点个方向,谢谢!

😪 你还是去 py 的国内邮件列表或者 v2ex 吧,这里的人大多玩 ruby.

#1 楼 @flowerwrong 感觉 ruby 大神多阿。。。而且感觉这个不是单纯的 python 问题

感觉你应该对比的是“直接 console 里运行 .py 文件的时间”和“service 调用这块代码的时间”

不贴代码能诊断出来问题才怪了。

#3 楼 @xiaogui #4 楼 @est 代码不能直接贴,公司内部用的,不过大概可以描述 耗时的代码大致内容是 string 匹配 string 数组 即类似于 arrTest = ['a', 'b'] if ( 'a' in arrTest): 这样的情况,if 内部执行的代码是对 panda 库的一条记录的一列数据进行附值。 i.e. post # panda object arrTest = ['a', 'b'] if ( 'a' in arrTest): post['colA'][0] = 'a' 并没有其他需要大量运算的代码 我有将时间 log 打在这段代码前后,发现直接 python xxx.py 的运行情况下耗时在 15000mircoseconds 左右,而通过 service,会高出 10 倍到 20 倍。 所以感觉不是代码复杂度导致的问题,即使贴出代码也并不会有太大帮助,因为两次执行的代码都是一模一样的,区别仅在于调用方式上。目前我查的方向在是不是由于框架本身一些限制导致,或者说 httpserver 是否都有一些影响效率的情况。但是 google 了一通又查不到什么东西,关键是这个问题不太好描述

第一次时间和第二次时间分别是怎么取到的?

#6 楼 @xiaogui 其他代码不管,只在这段 if 语句前后打印时间,然后 (endTime - startTime).microseconds,conosle 里平均 15,000,service 调用平均 300,000 另外我刚才简化的 if 里的代码,现在 if 语句的条件也去掉了,只剩下 pandas dataFrame object 的附值语句 post['a'][0] = 'a' 执行结果还是一样。。。 真是莫名了

看了下 api 和源码,问题已经解决了,哈哈,但是还有些疑惑,但至少能 work 了 解决办法: 将原先用于 dataFrame 对象附值的语句 post['a'][0] = 'test' 用 dataFrame 本身的 set_value 方法改写 post.set_value(0, 'a', 'test) 执行时间按 microseconds 计算,上面一种平均 20 万,下面一种方法,平均 50 但是造成这么大差距的原因需要继续深挖源码,暂时还不清楚。。。有待高手

profile 一下

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