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)