python的ufunc的示例

import numpy as np
import time

class A:
	def test_sum1(self,  _x):
		'''用python的方法计算-最慢
		'''
		self.sum = 0
		for x in _x:
			self.sum += x
		return self.sum

	def test_sum2(self,  _x):
		'''直接用numpy的sum方法计算-最快
		'''
		self.sum = np.sum (_x)
		return self.sum

	def my_sum3(self, _item):
		self.sum += _item

	def test_sum3(self,  _x):
		'''这是一种形式的ufun调用
		'''
		self.sum = 0
		func = np.frompyfunc(lambda x:self.my_sum3(x), 1,  1)
		func (_x)
		return self.sum

	def my_sum4(self):
		def my_sum_ufnc(_item):
			self.sum += _item

		return np.frompyfunc (my_sum_ufnc,  1,  1)

	def test_sum4(self,  _x):
		'''这是一种更快速的调用
		'''
		self.sum = 0
		self.my_sum4()(_x)
		return self.sum

if __name__ == '__main__':
	x = np.linspace(1,  10000,  10000000)
	a = A()

	print (x)
	start = time.clock()
	s = a.test_sum1(x)
	print ('%d, %.10f' % (s,  time.clock() - start))

	start = time.clock()
	s = a.test_sum2(x)
	print ('%d, %.10f' % (s,  time.clock() - start))

	start = time.clock()
	s = a.test_sum3(x)
	print ('%d, %.10f' % (s,  time.clock() - start))

	start = time.clock()
	s = a.test_sum4(x)
	print ('%d, %.10f' % (s,  time.clock() - start))


运行记录为:

50004999999, 3.4893534567
50004999999, 0.0122221365
50004999999, 4.7048496905
50004999999, 2.7798599126

可见使用test_sum4()是最快的ufunc。


相应的,对这个实验的疑问

  1. numpy的frompyfunc()的最后一个参数,指明了ufunc的返回值,尝试设为0后,报异常!问题是,我只是求和,确实也不用针对每个元素返回一个值。
  2. 如何写出一个漂亮的,如同numpy.sum()那么飞速的求和函数呢?请大家赐教!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值