考虑下面的一段代码,它生成一些(可能)巨大的多维数组并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) 我有一个相当复杂的递归函数,有许多参数(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) 我希望将我的数据库实现放在一个单独的模块或类中.但我正在努力解决一些细节问题.一个简单的例子:
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 模块,即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 的情况下构建和安装位于某处的某些源呢?