小编jim*_*ist的帖子

Numba代码比纯python慢

我一直在努力加快粒子滤波器的重采样计算.由于python有很多方法可以加速它,我虽然会尝试所有这些.不幸的是,numba版本非常慢.由于Numba应该加速,我认为这是我的错误.

我尝试了4个不同的版本:

  1. Numba
  2. 蟒蛇
  3. NumPy的
  4. 用Cython

每个代码如下:

import numpy as np
import scipy as sp
import numba as nb
from cython_resample import cython_resample

@nb.autojit
def numba_resample(qs, xs, rands):
    n = qs.shape[0]
    lookup = np.cumsum(qs)
    results = np.empty(n)

    for j in range(n):
        for i in range(n):
            if rands[j] < lookup[i]:
                results[j] = xs[i]
                break
    return results

def python_resample(qs, xs, rands):
    n = qs.shape[0]
    lookup = np.cumsum(qs)
    results = np.empty(n)

    for j in range(n):
        for i in range(n):
            if rands[j] < lookup[i]: …
Run Code Online (Sandbox Code Playgroud)

python performance numpy cython numba

15
推荐指数
1
解决办法
8460
查看次数

设置全局输出精度python

我编写了一个函数库,使我的工程作业更容易,并在python解释器中使用它们(有点像计算器).一些返回矩阵,一些返回浮点数.

问题是,它们返回太多小数.例如,目前,当一个数字为0时,我得到一个非常小的数字作为回报(例如6.123233995736766e-17)

我知道如何单独格式化输出,但这需要为我在解释器中键入的每一行添加格式化程序.我正在使用python 2.6.

有没有办法为会话设置全局输出格式(精度等)?

*注意:对于scipy功能,我知道我可以使用

scipy.set_printoptions(precision = 4, suppress = True)
Run Code Online (Sandbox Code Playgroud)

但这对于不使用scipy的函数似乎不起作用.

python formatting

5
推荐指数
3
解决办法
8272
查看次数

传递未知的args和kwargs在python中运行

我有一个对象,它接受一个函数名func,args和kwargs,并在某些时候运行

func(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

问题是,如果func不需要args/kwargs,则args/kwargs默认为None,这会导致TypeError.例如,如果函数不需要参数,则args,kwargs默认为None:

def test():
    pass

args = None

kwargs = None

test(*args, **kwargs)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-b9618694fbf2> in <module>()
----> 1 test(*args, **kwargs)

TypeError: test() argument after ** must be a mapping, not NoneType
Run Code Online (Sandbox Code Playgroud)

我确定有一个很好的方法来解决这个问题,如果没有级联if语句检查是否存在args/kwargs,每个都有自己的函数调用,但我不知道如何.主要目标是将一个函数及其未知参数传递给一个对象,然后在一个方法中使用它们.

编辑:为了清晰起见添加了一个例子

python

5
推荐指数
1
解决办法
1940
查看次数

python - 为什么可以在没有全局指定的情况下扩展修改值?

>>> x = []
>>> y = [1,2,3]
>>> def func1(L):
...     x+=L
... 
>>> def func2(L):
...     x.extend(L)
... 
>>> func1(y)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in func1
UnboundLocalError: local variable 'x' referenced before assignment
>>> func2(y)
>>> x
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

为什么列表extend()方法可以改变非全局变量,但+ =运算符不能?据我所知,只要函数没有赋值变量,它就可以在没有全局指定的情况下读取它.但在这种情况下,该函数确实设置了值.

python

2
推荐指数
1
解决办法
85
查看次数

标签 统计

python ×4

cython ×1

formatting ×1

numba ×1

numpy ×1

performance ×1