fork download
  1. import numpy as np
  2. from time import *
  3. from numba import njit as njit
  4. import numba.types
  5.  
  6. def gen(n,size):
  7. return np.array([np.concatenate((np.zeros(x,dtype=np.int32),np.random.randint(0,9,size-x))) for x in np.random.randint(0,size,n)])
  8.  
  9. def np_trim_zeros(arr):
  10. N=arr.shape[1]
  11. for i,x in enumerate(arr):
  12. m=np.trim_zeros(x)
  13. arr[i]=np.concatenate((m,np.zeros(N-len(m),dtype=np.int32)))
  14. return arr
  15.  
  16.  
  17.  
  18. def np_slice(arr):
  19. for i,x in enumerate(arr):
  20. t=0
  21. for c in x:
  22. if c==0:
  23. t+=1
  24. else:
  25. break
  26. arr[i]=np.concatenate((x[t:],x[:t])) #Вот эта фигня лишние переменные в памяти держит
  27. return arr
  28.  
  29. def np_slice_no_mem(arr):
  30. N=arr.shape[1]
  31. for i,x in enumerate(arr):
  32. t=0
  33. for c in x:
  34. if c==0:
  35. t+=1
  36. else:
  37. break
  38. arr[i][0:N-t]=x[t:N] #Вот эта возможно тоже, но меньше
  39. arr[i][N-t:]=0
  40. return arr
  41.  
  42. def np_musor(arr): #Я без комментариев это оставлю
  43. N=arr.shape[1]#Количество элементов в массиве
  44. #print(arr)
  45. masks=arr==0
  46. #print(masks)
  47. for i in range(N-1):
  48. masks[:,i+1]&=masks[:,i]
  49. if not masks[:,i+1].any():
  50. break
  51. i+=1
  52. sm=np.sum(masks,axis=1)
  53. #print(sm)
  54. for d in range(1,1+i):
  55. m=sm==d
  56. arr[m]=np.roll(arr[m],-d,axis=1)
  57. #print(arr)
  58.  
  59.  
  60. return arr
  61.  
  62.  
  63. #np_slice_no_mem_numba=njit(numba.types.void(numba.types.int32[:,:]))(np_slice_no_mem)
  64. @njit(numba.types.int32[:,:](numba.types.int32[:,:]))
  65. def np_numba(arr):
  66. N=arr.shape[1]
  67. for i,x in enumerate(arr):
  68. t=0
  69. for c in x:
  70. if c==0:
  71. t+=1
  72. else:
  73. break
  74. arr[i][0:N-t]=x[t:N]
  75. arr[i][N-t:]=0
  76. return arr
  77.  
  78.  
  79.  
  80. #arr=gen(1000,200) #1000 строк по 200 элементов
  81. #№arr=gen(107,10)
  82. #print(arr.shape)
  83. def prn(arr,n=3):
  84. for c in range(n):
  85. print(f'{arr[c][:20]} ...')
  86.  
  87. show=0 #False
  88.  
  89. def test(n,length,func):
  90. print(f'test {n}x{length}')
  91. arr = gen(n, length)
  92. if show:
  93. prn(arr)
  94. for fun in func:
  95. brr = arr.copy()
  96. t1 = time()
  97. brr = np.array(brr)
  98. brr = fun(brr)
  99. t2 = time()
  100. print(f" {fun.__name__} [{(t2-t1)*1000:.3f} ms]")
  101. if show:
  102. prn(brr, 1)
  103.  
  104.  
  105. test(1000,200,[np_trim_zeros,
  106. np_slice,
  107. np_slice_no_mem,
  108. np_musor,
  109. np_numba,]
  110. )
  111.  
  112. #exit()
  113.  
  114. test(10000,2000,[
  115. np_musor,
  116. np_numba,]
  117. )
  118.  
  119.  
Runtime error #stdin #stdout #stderr 0.68s 93152KB
stdin
Мой вывод:

test 1000x200
   np_trim_zeros [155.586 ms]
   np_slice [32.915 ms]
   np_slice_no_mem [31.915 ms]
   np_musor [7.976 ms]
   np_numba [0.998 ms]
test 10000x2000
   np_musor [322.147 ms]
   np_numba [47.011 ms]
stdout
Standard output is empty
stderr
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/dist-packages/numba/errors.py", line 627, in new_error_context
    yield
  File "/usr/local/lib/python3.7/dist-packages/numba/lowering.py", line 258, in lower_block
    self.lower_inst(inst)
  File "/usr/local/lib/python3.7/dist-packages/numba/lowering.py", line 301, in lower_inst
    val = self.lower_assign(ty, inst)
  File "/usr/local/lib/python3.7/dist-packages/numba/lowering.py", line 454, in lower_assign
    return self.lower_expr(ty, value)
  File "/usr/local/lib/python3.7/dist-packages/numba/lowering.py", line 937, in lower_expr
    res = impl(self.builder, (castval,))
  File "/usr/local/lib/python3.7/dist-packages/numba/targets/base.py", line 1132, in __call__
    res = self._imp(self._context, builder, self._sig, args, loc=loc)
  File "/usr/local/lib/python3.7/dist-packages/numba/targets/base.py", line 1157, in wrapper
    return fn(*args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/numba/targets/imputils.py", line 311, in wrapper
    _IternextResult(context, builder, pairobj))
  File "/usr/local/lib/python3.7/dist-packages/numba/targets/iterators.py", line 58, in iternext_enumerate
    srcres = call_iternext(context, builder, enumty.source_type, enum.iter)
  File "/usr/local/lib/python3.7/dist-packages/numba/targets/imputils.py", line 337, in call_iternext
    val = iternext_impl(builder, (val,))
  File "/usr/local/lib/python3.7/dist-packages/numba/targets/base.py", line 1132, in __call__
    res = self._imp(self._context, builder, self._sig, args, loc=loc)
  File "/usr/local/lib/python3.7/dist-packages/numba/targets/base.py", line 1157, in wrapper
    return fn(*args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/numba/targets/imputils.py", line 311, in wrapper
    _IternextResult(context, builder, pairobj))
  File "/usr/local/lib/python3.7/dist-packages/numba/targets/arrayobj.py", line 288, in iternext_array
    raise NotImplementedError("iterating over %dD array" % arrayty.ndim)
NotImplementedError: iterating over 2D array

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./prog.py", line 64, in <module>
  File "/usr/local/lib/python3.7/dist-packages/numba/decorators.py", line 183, in wrapper
    disp.compile(sig)
  File "/usr/local/lib/python3.7/dist-packages/numba/compiler_lock.py", line 32, in _acquire_compile_lock
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/numba/dispatcher.py", line 658, in compile
    cres = self._compiler.compile(args, return_type)
  File "/usr/local/lib/python3.7/dist-packages/numba/dispatcher.py", line 82, in compile
    pipeline_class=self.pipeline_class)
  File "/usr/local/lib/python3.7/dist-packages/numba/compiler.py", line 941, in compile_extra
    return pipeline.compile_extra(func)
  File "/usr/local/lib/python3.7/dist-packages/numba/compiler.py", line 372, in compile_extra
    return self._compile_bytecode()
  File "/usr/local/lib/python3.7/dist-packages/numba/compiler.py", line 872, in _compile_bytecode
    return self._compile_core()
  File "/usr/local/lib/python3.7/dist-packages/numba/compiler.py", line 859, in _compile_core
    res = pm.run(self.status)
  File "/usr/local/lib/python3.7/dist-packages/numba/compiler_lock.py", line 32, in _acquire_compile_lock
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/numba/compiler.py", line 253, in run
    raise patched_exception
  File "/usr/local/lib/python3.7/dist-packages/numba/compiler.py", line 244, in run
    stage()
  File "/usr/local/lib/python3.7/dist-packages/numba/compiler.py", line 731, in stage_nopython_backend
    self._backend(lowerfn, objectmode=False)
  File "/usr/local/lib/python3.7/dist-packages/numba/compiler.py", line 681, in _backend
    lowered = lowerfn()
  File "/usr/local/lib/python3.7/dist-packages/numba/compiler.py", line 668, in backend_nopython_mode
    self.metadata)
  File "/usr/local/lib/python3.7/dist-packages/numba/compiler.py", line 1063, in native_lowering_stage
    lower.lower()
  File "/usr/local/lib/python3.7/dist-packages/numba/lowering.py", line 177, in lower
    self.lower_normal_function(self.fndesc)
  File "/usr/local/lib/python3.7/dist-packages/numba/lowering.py", line 218, in lower_normal_function
    entry_block_tail = self.lower_function_body()
  File "/usr/local/lib/python3.7/dist-packages/numba/lowering.py", line 243, in lower_function_body
    self.lower_block(block)
  File "/usr/local/lib/python3.7/dist-packages/numba/lowering.py", line 258, in lower_block
    self.lower_inst(inst)
  File "/usr/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/usr/local/lib/python3.7/dist-packages/numba/errors.py", line 635, in new_error_context
    six.reraise(type(newerr), newerr, tb)
  File "/usr/local/lib/python3.7/dist-packages/numba/six.py", line 659, in reraise
    raise value
numba.errors.LoweringError: Failed in nopython mode pipeline (step: nopython mode backend)
iterating over 2D array

File "prog.py", line 67:
<source missing, REPL/exec in use?>

[1] During: lowering "$20.2 = iternext(value=$phi20.1)" at ./prog.py (67)