繁体   English   中英

多功能调用中的全局变量与局部变量效率

[英]Global vs local variable efficiency in multiple function call

首先要说明的是,我知道过早的优化总是不好的。 第二点警告,我对python还是相当陌生。

我正在读取数百万个数据块。 每个块由64位组成,并保存在numpy数组中。 为了对numpy.uint64类型执行位运算,所需的移位量也必须是相同的类型:numpy.uint64。

这可以通过强制转换数字或设置变量来实现。

number1 = numpy.uint64(80000)
shift_amount = numpy.uint64(8)
#option 1
number1 >> numpy.uint64(8)
#option2
number1 >> shift_amount

循环10000次并检查耗时。 我假设Option2总是胜出,因为创建numpy整数的开销仅完成一次。

我当前的程序为每个处理原始位的数据块调用一个函数。 此函数被称为数百万次,并附加了一些不同的列表。 假设相同的想法,并且仅对移位/位操作使用全局定义的值,则还要测试另外两个循环条件。

def using_global(number1):
    global shift_amount
    number1 >> shift_amount

def using_local(number1):
    shift = np.uint64(54)
    number1 >> shift 

使用global循环这些函数10000次总是快一个数量级。 问题:拥有一堆(超过10个)全局变量是否是错误的做法? https://wiki.python.org/moin/PythonSpeed/PerformanceTips指出局部变量会更快。 在这种情况下,我发现情况并非如此。 我的主循环只是为数百万个数据字中的每个字调用函数,因此这可能效率也很低。

Python并非用于大量运算。 脾气暴躁的是。 将所有数据垃圾放入一个numpy数组中。 这比使用循环和单个函数调用要快得多:

values = numpy.ndarray(1000000, dtype=numpy.uint64)
# fill in the data
values >>= 8

例如,如果您进行移位取决于最高的半字节,则从0到15的半字节值具有用于移位的查找表:

shift_by_nibble = numpy.array([8,16,24,30,34,60,50,40,44,48,52,56,62,4,12,20], dtype=numpy.uint8)
values >>= shift_by_nibble[values>>60]

using_global引用一个全局变量。 using_local引用一个局部变量,但它还包含对np.uint64()的调用,这会影响性能。

除非我对这个问题有误解,否则另一个有效的选择是将变量shift_amount传递给以下函数:

def my_func(number1, shift_amount):
    return number1 >> shift_amount

然后将函数调用为new_number = my_func(old_number, shift_amount)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM