【发布时间】:2015-09-26 22:57:29
【问题描述】:
首先需要注意的是,我知道过早的优化总是不好的。 第二个警告我对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 表示局部变量会更快。在这种情况下,我发现情况并非如此。我的主循环只是为数百万个数据字中的每个字调用该函数,因此这也可能效率低下。
【问题讨论】:
-
您不需要
global从全局读取,只需写入即可。如果您适当地命名变量,我认为对于常量来说这不是一个坏主意。 -
根本的区别是你只是在本地函数中创建 int,创建它大约需要函数总时间的 80%,所以它当然要慢很多
-
@ColonelThirtyTwo 感谢您的回复,实际上解决了很多问题。在这种情况下,我将继续从全局变量中读取它似乎是最有效的