小编Feo*_*ran的帖子

Numpy:将大型数组与dtype = int8相乘是SLOW

考虑下面的一段代码,它生成一些(可能)巨大的多维数组并numpy.tensordot用它执行(无论我们在这里乘以相同或两个不同的数组,并不重要).

import time
import numpy

L, N = 6, 4

shape = (2*L)*[N,]
A = numpy.arange(numpy.prod(shape)).reshape(shape)
A = A % 256 - 128   # [-127,+127]
axes=(range(1,2*L,2), range(0,2*L,2))

def run(dtype, repeat=1):
    A_ = A.astype(dtype)
    t = time.time()
    for i in range(repeat):
        numpy.tensordot(A_, A_, axes)
    t = time.time() - t
    print(dtype, '   \t%8.2f sec\t%8.2f MB' %(t, A_.nbytes/1e6))
Run Code Online (Sandbox Code Playgroud)

现在我们可以比较不同数据类型的性能,例如:

run(numpy.float64)
run(numpy.int64)
Run Code Online (Sandbox Code Playgroud)

由于数组只包含小整数,我想通过使用来节省一些内存dtype=int8.但是,这会减慢矩阵乘法A LOT.

以下是一些测试用例

第一个,对我的用例来说是重要的一个.其他仅供参考.使用Numpy 1.13.1和Python 3.4.2

大阵列

L, N = 6, 4; A.size = 4**12 = 16777216
<class …
Run Code Online (Sandbox Code Playgroud)

python arrays performance numpy

12
推荐指数
1
解决办法
670
查看次数

将functools.lru_cache与multiprocessing.Pool结合起来

我有一个相当复杂的递归函数,有许多参数(Obara-Saika-Scheme,如果有人想知道),我想更有效地推测.作为我应用的第一步@functools.lru_cache.作为第二步,我现在想multiprocessing.Pool用于异步评估一长串输入参数.

调整functools Python文档中第二个示例并添加我拥有的工作池:

from multiprocessing import Pool
from functools import lru_cache

@lru_cache(maxsize=10)
def fibonacci(n):
    print('calculating fibonacci(%i)' %n)
    if n < 2:
        return n
    return fibonacci(n-1)+fibonacci(n-2)

with Pool(processes=4) as pool:
    for i in range(10):
        res = pool.apply_async(fibonacci, (i,))
        print(res.get())

print(fibonacci.cache_info())
Run Code Online (Sandbox Code Playgroud)

问题1

如何通过不同的工作人员共享缓存.另一个问题(如何共享缓存?)是在问类似的事情,但我无法让它工作.以下是我对此的两种失败方法.

使用multiprocessing.Pool:

from multiprocessing import Pool
from functools import lru_cache
import time

@lru_cache(maxsize=10)
def fibonacci(n):
    print('calculating fibonacci(%i)' %n)   # log whether the function gets called
    if n < …
Run Code Online (Sandbox Code Playgroud)

python recursion caching multiprocessing

6
推荐指数
1
解决办法
898
查看次数

如何在单独的模块中管理peewee数据库?

我希望将我的数据库实现放在一个单独的模块或类中.但我正在努力解决一些细节问题.一个简单的例子:

from peewee import *

db = SqliteDatabase(':memory:')

class BaseModel(Model):
    class Meta:
        database = db

class User(BaseModel):
    name = CharField()

db.connect()
db.create_tables([User,])
db.commit()

@db.atomic()
def add_user(name):
    User.create(name=name).save()

@db.atomic()
def get_user(name):
    return User.get(User.name == name)
Run Code Online (Sandbox Code Playgroud)

到目前为止,这工作正常.我可以在这里实现我的数据库接口并将其作为模块导入.

现在我希望能够在运行时选择数据库文件.所以我需要一种方法来定义Model类而不需要先定义SqliteDatabase('somefile').我试图将所有内容封装在一个新的Database类中,稍后我可以从中导入并创建一个实例:

from peewee import *

class Database:

    def __init__(self, dbfile):
        self.db = SqliteDatabase(dbfile)

        class BaseModel(Model):
            class Meta:
                database = self.db

        class User(BaseModel):
            name = CharField()

        self.User = User

        self.db.connect()
        self.db.create_tables([User,])
        self.db.commit()

    @self.db.atomic()    # Error as self is not known on this level
    def …
Run Code Online (Sandbox Code Playgroud)

python database peewee

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

无需 root 的 Python setup.py

我想安装一些 Python 模块,即MATLAB Engine。MATLAB 全局安装在 下/usr/local/sw/matlab,因此我更改到相应的目录,然后setup.py按照链接文档中的说明运行。但是,我不是 root,所以我添加了该标志,如官方Python 文档--user所述。

这就是我得到的:

> python setup.py install --user running install running build running build_py creating build error: could not create 'build': Permission denied

显然它试图在当前目录中构建模块,而我没有写入权限。我可以通过跑步来回避这个问题

python setup.py build --build-base=/path/to/temp/build/dir

但后来我不知道如何安装它。另外,我无法结合这两种方法,因为install无法识别该--build-base选项。

我还尝试将整个matlabroot/extern/engines/python目录复制到其他地方并python setup.py install --user在那里运行,但这会产生

error: The installation of MATLAB is corrupted. Please reinstall MATLAB or contact Technical Support for assistance.

我想它再也找不到了matlabroot

那么,如何在/usr...不成为 root 的情况下构建和安装位于某处的某些源呢?

python matlab setup.py

0
推荐指数
1
解决办法
4258
查看次数