【发布时间】:2021-06-04 05:04:18
【问题描述】:
我有一个从数据库查询的list of tuples。
tuple_data = [(1.1,1,"one"),(2.1,2,"two"),(3.1,3,"three")]
每个tuple 将包含不同的数据类型。
从这个列表中,我需要每个元组的第一个元素,所以我这样做了:
data = [result[0] for result in tuple_data]
现在我尝试使用numba module 而不是list comprehension。
所以我尝试了以下方法:
@numba.njit(cache = True)
def loop_faster(results):
res = []
for result in results:
res.append(result[0])
这会抛出 NumbaPendingDeprecationWarning: ,我无法在迭代中使用元组列表(根据 numba 文档)
所以我把它改成了numpy array(From here):
L_arr = np.array(tuple_data)
现在一切正常。loop_fastermethod 工作正常。
问题是,我的原始数据是 (float, int, str) 而更改为 numpy array 它的全部是 (str,str,str),这是预期的。
问题是我希望数据本身为float。
所以我的代码如下:
import numba, logging
import numpy as np
numba_logger = logging.getLogger('numba')
numba_logger.setLevel(logging.WARNING)
@numba.njit(cache = True)
def loop_faster_1(results, n):
res = []
for result in results:
res.append(result[0])
print(res)
t1 = [(1.1,1,"one"),(2.1,2,"two"),(3.1,3,"three")]
L_arr = np.array(t1)
loop_faster_1(L_arr,0)
在实际情况下,我的元组列表很大,我将其转换为 numpy array 为 numba 并且我需要浮点数据,因此我必须将所有 str 转换为浮点数。
基本上用 numba,
- 元组列表
- 转换为 numpy 数组
- 调用numba方法
- 转换回浮动
- 用于进一步处理。
但有列表理解,
- 元组列表
- 列表理解
- 用于进一步处理。
有没有更好的方法来使用numba?或者我只是使用 list comprehension 在使用 numba 时删除这些步骤。
因为有了这个,我觉得我实际上正在扼杀减少循环时间的目的。
【问题讨论】:
-
Larr[:,0]是数组的第一列。不需要麻木。但是将列表转换为数组需要时间。您可以通过制作结构化数组来绕过浮点到字符串的转换。