2011-12-17 46 views
0
>>> from pandac.PandaModules import Vec3 
>>> import numpy 
>>> l = [] 
>>> l.append(Vec3(1,1,1)) 
>>> l.append(Vec3(1,1,1)) 
>>> l.append(Vec3(1,1,1)) 
>>> Vec3(1,1,1)+Vec3(1,1,1) 
Vec3(2, 2, 2) 
>>> sum(l) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for +: 'int' and 'libpanda.Vec3' 
>>> numpy.sum(l) 
9.0 
>>> 

我想要一些快(快==不是纯Python但numpy的速度环)方法才达到:numpy的:点之

>>> my_smart_sum(l) 
Vec3(3,3,3) 
+0

好的我发现这个方法:reduce(lambda x,y:x + y,l)有一些缺点吗? – nkint 2011-12-17 17:36:48

+1

有一个缺点,它是最好的解释[这里](http://stackoverflow.com/questions/1892324/why-program-functionally-in-python/1892614#1892614)。 – 2011-12-17 18:22:59

回答

2

试试这个:

sum(l, start=Vec3(0,0,0)) 

或者,与numpy,这个:

numpy.sum(l, axis=0) 

速度取决于执行矢量添加。您应该使用timeit来确定哪种方法最快。这可能是这个样子:

python -m timeit "import numpy; foo = [[1,1,1],[1,1,1]]" "numpy.sum(foo, axis=0)" 
10000 loops, best of 3: 46.5 usec per loop 

你传递的第一个字符串是设置语句 - 这将不会被包含在时序。你传递的第二个字符串是你实际想要的代码。我对pandac一无所知,但有时使用Cython可以加速数字运算循环。

+0

与开始总结诀窍。因为我需要一个Vec3的返回值,并且numpy.sum返回一个numpy数组。 pandac是一个用C++编写的渲染引擎,用python包装,所以我认为它是可以的。 – nkint 2011-12-17 17:35:48

+0

使用减少的任何缺点? – nkint 2011-12-17 17:37:16