您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 比较numba编译函数中的字符串

5b51 2022/1/14 8:21:40 python 字数 5048 阅读 513 来源 www.jb51.cc/python

我正在寻找比较使用numba jit编译的python函数中的字符串的最佳方法(没有python模式,python 3).用例如下:import numba as nb @nb.jit(nopython = True, cache = True) def foo(a, t = 'default'): if t == 'awesome':

概述

我正在寻找比较使用numba jit编译的python函数中的字符串的最佳方法(没有python模式,python 3).

用例如下:

import numba as nb

@nb.jit(nopython = True,cache = True)
def foo(a,t = 'default'):
    if t == 'awesome':
        return(a**2)
    elif t == 'default':
        return(a**3)
    else:
        ...

但是,返回以下错误

Invalid usage of == with parameters (str,const('awesome'))

我尝试使用字节但无法成功.

谢谢 !

莫里斯指出了问题Python: can numba work with arrays of strings in nopython mode?,但我看的是本机python,而不是numba支持的numpy子集.

documentation

2.6.2.1. int,bool […]

2.6.2.2. float,complex […]

2.6.2.3. tuple […]

2.6.2.4. list […]

2.6.2.5. set […]

2.6.2.7. bytes,bytearray,memoryview

The bytearray type and,on Python 3,the bytes type support indexing,iteration and retrieving the len().

[…]

因此根本不支持字符串,字节不支持相等性检查.

但是,您可以传入字节并迭代它们.这使得编写自己的比较函数成为可能:

import numba as nb

@nb.njit
def bytes_equal(a,b):
    if len(a) != len(b):
        return False
    for char1,char2 in zip(a,b):
        if char1 != char2:
            return False
    return True

不幸的是,下一个问题是numba不能“降低”字节,所以你不能直接硬编码函数中的字节.但是字节基本上只是整数,而bytes_equal函数适用于numba支持的所有类型,它们具有长度并且可以迭代.所以你可以简单地将它们存储为列表:

import numba as nb

@nb.njit
def foo(a,t):
    if bytes_equal(t,[97,119,101,115,111,109,101]):
        return a**2
    elif bytes_equal(t,[100,102,97,117,108,116]):
        return a**3
    else:
        return a

或者作为全局数组(感谢@chrisb – 请参阅注释):

import numba as nb
import numpy as np

AWESOME = np.frombuffer(b'awesome',dtype='uint8')
DEFAULT = np.frombuffer(b'default',dtype='uint8')

@nb.njit
def foo(a,AWESOME):
        return a**2
    elif bytes_equal(t,DEFAULT):
        return a**3
    else:
        return a

两者都能正常工作:

>>> foo(10,b'default')
1000
>>> foo(10,b'awesome')
100
>>> foo(10,b'awe')
10

但是,您不能将bytes数组指定为认值,因此需要显式提供t变量.这样做也让人觉得很烦.

我的观点:只需执行if t == …检查正常函数调用ifs中的专用numba函数.字符串比较在Python中非常快,只需将数学/数组密集型内容包装在numba函数中:

import numba as nb

@nb.njit
def awesome_func(a):
    return a**2

@nb.njit
def default_func(a):
    return a**3

@nb.njit
def other_func(a):
    return a

def foo(a,t='default'):
    if t == 'awesome':
        return awesome_func(a)
    elif t == 'default':
        return default_func(a)
    else:
        return other_func(a)

但请确保您确实需要numba功能.有时普通的Python / NumPy足够快.只需简要介绍numba解决方案和Python / NumPy解决方案,看看numba是否能让它显着提高速度.

总结

以上是编程之家为你收集整理的python – 比较numba编译函数中的字符串全部内容,希望文章能够帮你解决python – 比较numba编译函数中的字符串所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶