首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python Numpy数据类型性能

Python Numpy数据类型性能
EN

Stack Overflow用户
提问于 2013-03-11 22:13:08
回答 2查看 9.3K关注 0票数 27

所以我做了一些测试,得到了奇怪的结果。

代码:

代码语言:javascript
复制
import numpy as np
import timeit


setup = """
import numpy as np
A = np.ones((1000,1000,3), dtype=datatype)
"""

datatypes = "np.uint8", "np.uint16", "np.uint32", "np.uint64",  "np.float16", "np.float32", "np.float64"

stmt1 = """
A = A * 255
A = A / 255
A = A - 1
A = A + 1
"""
#~ np.uint8 : 1.04969205993
#~ np.uint16 : 1.19391073202
#~ np.uint32 : 1.37279821351
#~ np.uint64 : 2.99286961148
#~ np.float16 : 9.62375889588
#~ np.float32 : 0.884994368045
#~ np.float64 : 0.920502625252

stmt2 = """
A *= 255
A /= 255
A -= 1
A += 1
"""
#~ np.uint8 : 0.959514497259
#~ np.uint16 : 0.988570167659
#~ np.uint32 : 0.963571471946
#~ np.uint64 : 2.07768933333
#~ np.float16 : 9.40085450056
#~ np.float32 : 0.882363984225
#~ np.float64 : 0.910147440048

stmt3 = """
A = A * 255 / 255 - 1 + 1
"""
#~ np.uint8 : 1.05919667881
#~ np.uint16 : 1.20249978404
#~ np.uint32 : 1.58037744789
#~ np.uint64 : 3.47520357571
#~ np.float16 : 10.4792515701
#~ np.float32 : 1.29654744484
#~ np.float64 : 1.80735079168

stmt4 = """
A[:,:,:2] *= A[:,:,:2]
"""
#~ np.uint8 : 1.23270964172
#~ np.uint16 : 1.3260807837
#~ np.uint32 : 1.32571002402
#~ np.uint64 : 1.76836543305
#~ np.float16 : 2.83364821535
#~ np.float32 : 1.31282323872
#~ np.float64 : 1.44151875479

stmt5 = """
A[:,:,:2] = A[:,:,:2] * A[:,:,:2]
"""
#~ np.uint8 : 1.38166223494
#~ np.uint16 : 1.49569114821
#~ np.uint32 : 1.53105315419
#~ np.uint64 : 2.03457943366
#~ np.float16 : 3.01117795524
#~ np.float32 : 1.51807271679
#~ np.float64 : 1.7164808877

stmt6 = """
A *= 4
A /= 4
"""
#~ np.uint8 : 0.698176392658
#~ np.uint16 : 0.709560468038
#~ np.uint32 : 0.701653066443
#~ np.uint64 : 1.64199069295
#~ np.float16 : 4.86752675499
#~ np.float32 : 0.421001675475
#~ np.float64 : 0.433056710408

stmt7 = """
np.left_shift(A, 2, A)
np.right_shift(A, 2, A)
"""
#~ np.uint8 : 0.381521115341
#~ np.uint16 : 0.383545967785
#~ np.uint32 : 0.386147272415
#~ np.uint64 : 0.665969478824


for stmt in [stmt1, stmt2, stmt3, stmt4, stmt5, stmt6, stmt7]:
    print stmt
    for d in datatypes:
        s = setup.replace("datatype", d)
        T = timeit.Timer(stmt=stmt, setup=s)
        print d,":", min(T.repeat(number=30))
    print
print

为什么float16这么慢?为什么float32这么快?它通常比整数运算快。

如果您有任何相关的性能技巧,我将很高兴听到他们。

这是在Windows8 64位上的python 2.6.6 32位。Numpy 1.6,Numpy 1.7的数字相似。现在将测试MKL优化版本:http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy

编辑:事实证明,MKL版本在某些浮点运算情况下会稍微快一些,但对于整数运算,有时会慢得多:

代码语言:javascript
复制
stmt2 = """
A *= 255
A /= 255
A -= 1
A += 1
"""
#np1.6
#~ np.uint8 : 0.959514497259
#~ np.uint16 : 0.988570167659
#~ np.uint32 : 0.963571471946
#~ np.uint64 : 2.07768933333
#~ np.float16 : 9.40085450056
#~ np.float32 : 0.882363984225
#~ np.float64 : 0.910147440048

# np1.7
#~ np.uint8 : 0.979
#~ np.uint16 : 1.010
#~ np.uint32 : 0.972
#~ np.uint64 : 2.081
#~ np.float16 : 9.362
#~ np.float32 : 0.882
#~ np.float64 : 0.918

# np1.7 mkl
#~ np.uint8 : 1.782
#~ np.uint16 : 1.145
#~ np.uint32 : 1.265
#~ np.uint64 : 2.088
#~ np.float16 : 9.029
#~ np.float32 : 0.800
#~ np.float64 : 0.866
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-11 22:33:44

我猜半精度算术(float16)是必须由numpy“模拟”的东西,因为在底层C语言中(以及在适当的处理器指令中)没有对应的类型。另一方面,使用本机数据类型可以非常高效地完成单精度(float32)和双精度(float64)操作。

由于单精度运算的良好性能:现代处理器具有用于向量化浮点运算(例如AVX)的高效单元,因为它也是良好的多媒体性能所必需的。

票数 24
EN

Stack Overflow用户

发布于 2013-03-11 22:38:39

大多数常见的CPU都不直接支持16位浮点数(尽管显卡供应商显然涉及到这种数据类型,所以我希望GPU最终会支持它)。我希望他们以一种相对缓慢的方式被效仿。谷歌告诉我,float16 was once hardware-dependent和一些人想在不支持它的硬件上模拟它,尽管我没有发现任何关于这是否真的发生的事情。

另一方面,32位浮点数不仅是本机支持的,您还可以使用SIMD指令集扩展向量化它们上的许多操作,这大大减少了您基准测试的那种操作的开销。唯一的例外是数据的混洗,但在这种情况下,float32与int32不相上下,两者都可以使用相同的SIMD指令来加载和存储更大的内存块。

虽然也有用于整数数学的SIMD指令,但它们不太常见(例如,请参阅在比float版本更晚的版本中引入它们),而且通常不那么复杂。我的猜测是(您的构建) NumPy没有对您来说较慢的操作的SIMD实现。或者,整数运算可能没有优化:浮点数用于许多易于矢量化的应用程序中,这些应用程序的性能非常重要(例如图像/媒体/视频编码和解码),因此它们可能会更优化。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15340781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档