numba 中 datetime.datetime.utcfromtimestamp(dateFrom) 的解决方法?
Workaround for datetime.datetime.utcfromtimestamp(dateFrom) in numba?
使用 numba,并非所有在通常 Python 脚本中可能使用的东西都可以使用。
我想将 int
对象转换为 datetime
对象。通常 Python,这可以通过以下方式完成:
dateFrom = 0
a = datetime.datetime.utcfromtimestamp(dateFrom)
print (a)
> 1970-01-01 00:00:00
使用 numba 这会导致错误:
import numba as nb
import datetime
@nb.jit(nopython=True)
def abc():
dateFrom = 0
a = datetime.datetime.utcfromtimestamp(dateFrom)
return a
print(abc())
错误:
Traceback (most recent call last):
File "/home/user/venv/numba/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3326, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-12-0ded7f14df2a>", line 1, in <module>
print(abc())
File "/home/user/venv/numba/lib/python3.6/site-packages/numba/dispatcher.py", line 401, in _compile_for_args
error_rewrite(e, 'typing')
File "/home/user/venv/numba/lib/python3.6/site-packages/numba/dispatcher.py", line 344, in error_rewrite
reraise(type(e), e, None)
File "/home/user/venv/numba/lib/python3.6/site-packages/numba/six.py", line 668, in reraise
raise value.with_traceback(tb)
numba.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Unknown attribute 'datetime' of type Module(<module 'datetime' from '/home/user/anaconda3/lib/python3.6/datetime.py'>)
File "<ipython-input-11-a989c5d8d15a>", line 8:
def abc():
<source elided>
dateFrom = 0
a = datetime.datetime.utcfromtimestamp(dateFrom)
^
....
To see Python/NumPy features supported by the latest release of Numba visit:
http://numba.pydata.org/numba-doc/latest/reference/pysupported.html
and
http://numba.pydata.org/numba-doc/latest/reference/numpysupported.html
如何在使用 numba 时获得正确打印的类似日期时间的对象?
numba
的专家给了我解决方案:
使用 with objmode()
可以回调 python 解释器。详情:https://numba.pydata.org/numba-doc/dev/user/withobjmode.html
示例:
from numba import njit, objmode
from numba.typed import List
import datetime
@njit
def foo(lst):
for i in lst:
if i % 1000 == 0:
with objmode():
print(datetime.datetime.utcfromtimestamp(i))
# do compute here
l = List()
for i in range(10000):
l.append(i)
foo(l)
使用 numba,并非所有在通常 Python 脚本中可能使用的东西都可以使用。
我想将 int
对象转换为 datetime
对象。通常 Python,这可以通过以下方式完成:
dateFrom = 0
a = datetime.datetime.utcfromtimestamp(dateFrom)
print (a)
> 1970-01-01 00:00:00
使用 numba 这会导致错误:
import numba as nb
import datetime
@nb.jit(nopython=True)
def abc():
dateFrom = 0
a = datetime.datetime.utcfromtimestamp(dateFrom)
return a
print(abc())
错误:
Traceback (most recent call last):
File "/home/user/venv/numba/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3326, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-12-0ded7f14df2a>", line 1, in <module>
print(abc())
File "/home/user/venv/numba/lib/python3.6/site-packages/numba/dispatcher.py", line 401, in _compile_for_args
error_rewrite(e, 'typing')
File "/home/user/venv/numba/lib/python3.6/site-packages/numba/dispatcher.py", line 344, in error_rewrite
reraise(type(e), e, None)
File "/home/user/venv/numba/lib/python3.6/site-packages/numba/six.py", line 668, in reraise
raise value.with_traceback(tb)
numba.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Unknown attribute 'datetime' of type Module(<module 'datetime' from '/home/user/anaconda3/lib/python3.6/datetime.py'>)
File "<ipython-input-11-a989c5d8d15a>", line 8:
def abc():
<source elided>
dateFrom = 0
a = datetime.datetime.utcfromtimestamp(dateFrom)
^
....
To see Python/NumPy features supported by the latest release of Numba visit:
http://numba.pydata.org/numba-doc/latest/reference/pysupported.html
and
http://numba.pydata.org/numba-doc/latest/reference/numpysupported.html
如何在使用 numba 时获得正确打印的类似日期时间的对象?
numba
的专家给了我解决方案:
使用 with objmode()
可以回调 python 解释器。详情:https://numba.pydata.org/numba-doc/dev/user/withobjmode.html
示例:
from numba import njit, objmode
from numba.typed import List
import datetime
@njit
def foo(lst):
for i in lst:
if i % 1000 == 0:
with objmode():
print(datetime.datetime.utcfromtimestamp(i))
# do compute here
l = List()
for i in range(10000):
l.append(i)
foo(l)