I want to get a buffer from a numpy array in Python 3. I have found the following code:
$ python3
Python 3.2.3 (default, Sep 25 2013, 18:25:56)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> a = numpy.arange(10)
>>> numpy.getbuffer(a)
However it produces the error on the last step:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'getbuffer'
Why am I doing wrong? The code works fine for Python 2. The numpy version I'm using is 1.6.1.
According to Developer notes on the transition to Python 3:
PyBuffer (object)
Since there is a native buffer object in Py3, the
memoryview
, thenewbuffer
andgetbuffer
functions are removed from multiarray in Py3: their functionality is taken over by the new memoryview object.
>>> import numpy
>>> a = numpy.arange(10)
>>> memoryview(a)
<memory at 0xb60ae094>
>>> m = _
>>> m[0] = 9
>>> a
array([9, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Numpy's arr.tobytes()
seems to be significantly faster than bytes(memoryview(arr))
in returning a bytes
object.
So, you may want to have a look at tobytes()
as well.
Profiling for Windows 7 on Intel i7 CPU, CPython v3.5.0, numpy v1.10.1.
(Edit Note: same result order on Ubuntu 16.04, Intel i7 CPU, CPython v3.6.5, numpy v1.14.5.)
setup = '''import numpy as np; x = np.random.random(n).reshape(n//10, -1)'''
results
globals: {'n': 100}, tested 1e+06 times
time (s) speedup methods
0 0.163005 6.03x x.tobytes()
1 0.491887 2.00x x.data.tobytes()
2 0.598286 1.64x memoryview(x).tobytes()
3 0.964653 1.02x bytes(x.data)
4 0.982743 bytes(memoryview(x))
globals: {'n': 1000}, tested 1e+06 times
time (s) speedup methods
0 0.378260 3.21x x.tobytes()
1 0.708204 1.71x x.data.tobytes()
2 0.827941 1.47x memoryview(x).tobytes()
3 1.189048 1.02x bytes(x.data)
4 1.213423 bytes(memoryview(x))
globals: {'n': 10000}, tested 1e+06 times
time (s) speedup methods
0 3.393949 1.34x x.tobytes()
1 3.739483 1.22x x.data.tobytes()
2 4.033783 1.13x memoryview(x).tobytes()
3 4.469730 1.02x bytes(x.data)
4 4.543620 bytes(memoryview(x))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With