免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷

强调实用主义——采访Python专家HyryStudio [复制链接]

论坛徽章:
0
发表于 2012-05-31 01:13 |显示全部楼层
最后一句说的太好了。 其实应该把文旦等这些都认真的做,相信发展的会更好。

论坛徽章:
0
发表于 2012-05-31 08:48 |显示全部楼层
回复 17# HyryStudio

我曾经工作共有个需求,是将一个服务器接收的数据包转发到另外一台服务器,1秒钟有几个百个并发请求,就会发现Python有很大的瓶颈,速度好慢,我已经使用了multiprocess、stackless等方式,包括用堆栈,进行异步处理,把数据都放到了内存中(用的字典),但还是因为性能问题放弃了这种方式。

除此之外,能多谈谈Cython的实现吗?
   

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
发表于 2012-05-31 13:04 |显示全部楼层
回复 11# 追忆的风筝


    python 的优势在于轻便和灵活,速度确实不如matlab,这一点上python还是稍逊一筹的。 优化竟可能还是提高程序本身的实现技巧吧。能不重复计算的就不要重复计算,能多机并行的,就不要在一个机器上死磕

论坛徽章:
0
发表于 2012-05-31 13:52 |显示全部楼层
回复 23# crazyhadoop

并行计算是一个思路,将数据流分布到不同的服务器上,将结果进行汇总。但数据处理方式很多,但有些时候瓶颈不在这。Python实现分布式计算,可以分享下经验吗?
   

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
发表于 2012-05-31 14:10 |显示全部楼层
回复 24# 追忆的风筝


    如果有大量的运算数据要做,我会把这些数据按照使用的顺序划分一下,比如在文本分类计算的时候,首先处理原始数据,每200M分出一个文件,然后训练程序就开始去读取这些文件。慢慢的就会有 10个左右的进程在同时处理这些文件。然后再汇总结果,基本就是这样吧。那么多核不要浪费。

论坛徽章:
0
发表于 2012-05-31 16:55 |显示全部楼层
在工作中有些情况是,在并发请求大的时候,就算用Python把请求的数据往内存里放,都放不进去。先不说数据处理用多长时间,至少不能丢数据啊,实在是郁闷。

论坛徽章:
0
发表于 2012-05-31 18:39 |显示全部楼层
追忆的风筝 发表于 2012-05-31 08:48
回复 17# HyryStudio

我曾经工作共有个需求,是将一个服务器接收的数据包转发到另外一台服务器,1秒钟有 ...


网络并发的话,瓶颈应该不在CPU处理之上,而是在网络处理吧。我对这个不熟悉,不过就我多年在Python社区潜水的经验,似乎gevent之类的异步处理库应该能实现高并发吧。如果瓶颈在CPU对数据包的处理的话,那就可以用Cython之类的加速了。

Cython将Python程序翻译成调用Python API的C语言程序,然后进行编译。如果是针对纯Python程序的话,翻译成C语言可以节省Python虚拟机中的那个解释用的大循环,运行速度能够提高30%左右。

如果使用Cython的静态语言关键字对程序中一些变量进行类型定义的话,Cython就可以将程序翻译成更加优化的C语言程序,从而大幅度提高运行速度。例如下面的程序:

a = []
a.append(1)

如果Cython不知道a是列表,它就会调用Python API首先向对象a请求append方法对象,然后再通过Python的函数调用运行append方法。

但是如果:

list a = []
a.append(1)

那么Cython知道a是一个列表,于是它直接调用Python API中往列表中添加对象的函数,可以节省不少运行时间。

论坛徽章:
0
发表于 2012-05-31 18:41 |显示全部楼层
本帖最后由 HyryStudio 于 2012-05-31 18:43 编辑

回复 23# crazyhadoop


其实MATLAB也只是针对一些矢量运算调用底层Fortran库时速度很快,这部分和Python调用的库是差不多的,所以MATLAB在这方面和NumPy,SciPy是一个级别的。

至于程序内部的循环判断等语句的执行速度,据说最近的MATLAB有JIT,可以大幅度提高程序的运算速度,不过我很久没有用过MATLAB了,不太清楚。

最近有一个新的语言Juila,它提供了一个简单的运算速度比较:

http://julialang.org/

从那个比较的表格可以看出:
  1. def fib(n):
  2.    if n<2:
  3.        return n
  4.    return fib(n-1)+fib(n-2)

  5. 运行速度比较
  6. Python 31.47
  7. matlab 1336.37
  8. Javascript(V8) 1.55
复制代码
fib这样的递归调用函数Python比MATLAB快40倍,很有可能MATLAB不能对大量的函数调用进行JIT优化,因此非JIT优化的MATLAB代码可能比Python慢。而Javascript的V8引擎能进行JIT,因此又比Python快20倍。
  1. def pisum():
  2.    sum = 0.0
  3.    for j in xrange(1, 500):
  4.        sum = 0.0
  5.        for k in xrange(1, 10000):
  6.            sum += 1.0/(k*k)
  7.    return sum

  8. 运行速度比较
  9. Python  18.03
  10. matlab  1.08
  11. Javascript(V8) 0.75
复制代码
对于pi_sum这样的简单的循环判断程序,MATLAB可能做了JIT,因此比Python快18倍,而MATLAB的JIT略逊于Javascript(V

但是我用Cython将pisum重新写了一下:
  1. def pisum2():
  2.    cdef double sum
  3.    cdef int j, k
  4.    sum = 0.0
  5.    for j in range(1, 500):
  6.        sum = 0.0
  7.        for k in range(1, 10000):
  8.            sum += 1.0/(k*k)
  9.    return sum
复制代码
它的运算速度提高了30倍。

论坛徽章:
0
发表于 2012-05-31 18:56 |显示全部楼层
回复 18# pitonas

我个人觉得将来的发展也不太好预测,不过我个人觉得

1. 首先是将众多的扩展库移植到Python3

2. 提速,Guido在下面的视频中提到,如果有将来办法让Python做一些静态的分析,例如添加一些静态的声明,也许可以提高程序的运行速度。

http://pyvideo.org/video/956/keynote-guido-van-rossum

论坛徽章:
0
发表于 2012-06-01 08:26 |显示全部楼层
回复 27# HyryStudio

感谢回答!
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP