【问题标题】:avoid usage of str() in numba optimized functions避免在 numba 优化函数中使用 str()
【发布时间】:2019-08-14 01:42:03
【问题描述】:

在下面的代码sn-p中,我想避免在函数foo中使用str()

import numpy as np

def foo(a):
    for runner in range(a.shape[0]):
        row = a[runner, :]
        toPrint = str(runner) + ' '+ str(row)
        print(toPrint)

myArray = np.array(np.arange(9).reshape(3,-1)).astype('float')

foo(myArray)

输出:

0 [0. 1. 2.]
1 [3. 4. 5.]
2 [6. 7. 8.]

背景:我使用 numba (https://numba.pydata.org/ ),其中 str() 在 numba 优化函数中的使用是不可能的。

如果不允许使用str()foo 的代码应该是什么样子?即,不应发生任何导入(因为大多数时候 numba 不适用于它们)。

【问题讨论】:

  • 我认为简单的答案是不要在该函数中打印。你能在调用函数中返回值并打印出来吗?
  • 添加到@PaulRooney 的评论中,您正在循环打印,所以yield 可能会代替return 工作。
  • 也许您可以在打印之前将其附加到列表中?如果你真的想看的话。

标签: python numba


【解决方案1】:

考虑字符串格式:

toPrint = '{} {}'.format(runner, row)
print(toPrint)

或者简单地说(因为默认情况下有一个空格分隔参数):

print(runner, row)

#  or [if you want to keep the toPrint variable]:

toPrint = (runner, row)
print(*toPrint)

【讨论】:

  • 无论如何,格式都会隐式调用str,所以它可能不起作用。
  • 是的,@iz_ 是对的,不幸的是,格式不适用于 numba。打印虽然有效。
  • 不幸的是,print 也会调用strrepr 之一。
【解决方案2】:

如果您不想在函数 foo 中使用 str() 函数,为什么不先将结果附加到临时列表中,然后再打印出来?

import numpy as np
list1 = []

def foo(a):
    for runner in range(a.shape[0]):
        row = a[runner, :]
        toPrint = str(runner) + ' '+ str(row)
        list1.append(toPrint)

myArray = np.array(np.arange(9).reshape(3,-1)).astype('float')

foo(myArray)
print(list1)

【讨论】:

    猜你喜欢
    • 2018-04-14
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多