python里一个被调用了上百万次的小函数改成C语言能不能提高效率?

qpx1125 2013-05-11 05:28:37
我有一个python程序,有一个函数是求两个向量的内积

def product(v1, v2):
sum = 0
for x,y in zip(v1,v2):
sum += x*y
return sum

该函数被调用180万次,占了程序运行时间的90%+,改成C语言的能不能提高效率?我上网搜了一下,改成C语言模块的话,链表里的元素也得用PyTuple_GetItem一个一个取出来,所以是不是也提高不了效率,哪怕一点点?
...全文
331 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qpx1125 2013-05-12
  • 打赏
  • 举报
回复
引用 5 楼 notax 的回复:

...
from itertools import imap,starmap,izip
sum(starmap(mul,izip(v1,v2)))
测了一下,比 原来的快了一倍 估计C的话快十倍
函数调用本身好像就有不少开销,所以并没有快那么多,我这只快了两倍
qpx1125 2013-05-12
  • 打赏
  • 举报
回复
引用 4 楼 panghuhu250 的回复:
(没实践经验)不过我想你避免频繁在c与pyton直接传递数据,所以仅仅把这个小函数用c实现意义不大,应该把产生这180万次调用的循环一块转成c。 另外,从算法方面考虑优化了吗?
这180万次不是在一个循环中调用的,而是被整个程序的很多地方调用,所以不容易把上层一起改成C
qpx1125 2013-05-12
  • 打赏
  • 举报
回复
鼓捣一晚上,搞好了,效率果然提高不少,运行时间减少到原来的三分之一。

static PyObject* product(PyObject* self, PyObject* args) 
{
    PyObject *x, *y;
    PyObject *list1, *list2;    
    int len;
    int i;
    float value = 0.0;
    if (!PyArg_ParseTuple(args, "O|O", &list1, &list2)) return NULL;
    len = PyList_GET_SIZE(list1);   
    for(i=0;i <len;++i)
    {
        x = PyList_GetItem(list1,i);   
        y = PyList_GetItem(list2,i);   
        value += PyFloat_AsDouble(x) * PyFloat_AsDouble(y);
    }
    return Py_BuildValue("f", value);
     
}
notax 2013-05-11
  • 打赏
  • 举报
回复

...
from itertools import imap,starmap,izip
sum(starmap(mul,izip(v1,v2)))
测了一下,比 原来的快了一倍 估计C的话快十倍
panghuhu250 2013-05-11
  • 打赏
  • 举报
回复
(没实践经验)不过我想你避免频繁在c与pyton直接传递数据,所以仅仅把这个小函数用c实现意义不大,应该把产生这180万次调用的循环一块转成c。 另外,从算法方面考虑优化了吗?
ImN1 2013-05-11
  • 打赏
  • 举报
回复
实际问题实际分析吧,我所肯定的生成器表达式要高于for循环,这个我实际作业中比较过(统计近20万文件的大目录字节数) 但zip()的效率是否反而是最大瓶颈就不可而知了
qq120848369 2013-05-11
  • 打赏
  • 举报
回复
关键路径上的代码当然值得优化,可以用C来实现,提升不止一点点。 楼上说效率一定高不敢认同,这得看Python的sum调用损耗是否可以忽略,这在C/C++里如此短小而高频的函数都是应当内联优化的。
ImN1 2013-05-11
  • 打赏
  • 举报
回复
1.可以提高 2.你这个也不是优化写法 直接写 sum((x*y for x,y in zip(v1,v2))) 效率肯定比你原来的高

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧