我正在使用Enthought的Canopy/EPD版本的python,它附带了与MKL相关联的numpy.我目前在我的工作计算机(Windows 7,四核i5 @ 3.33 Ghz,4 GB RAM)和我的家庭工作站(Mac Pro 3.1,Ubuntu 12.04,2x四核Xeon)上并行运行一组模拟(使用PP) @ 2.8 Ghz,6 GB ram).
但是当我对我的模拟进行基准测试时,它们在工作计算机上的运行速度要快得多(每次迭代35秒,而在mac pro上为60秒).问题是核心(易并行问题)之间完美的平衡,所以我怀疑是家里的Linux工作站上的MKL库的问题.有没有办法验证MKL库实际上是否在python中使用.我已经读过线程,说你可以检查python是否链接到它,但它不能确保它是正确构建的并且实际上正在使用.
我正试图在Anaconda的Numba软件包中使用cuBLAS功能并遇到问题.我需要输入矩阵为C顺序.输出可以是Fortran顺序.
我可以在这里运行随包提供的示例脚本.该脚本有两个功能,gemm_v1
和gemm_v2
.在gemm_v1
,用户必须以Fortran顺序创建输入矩阵.在gemm_v2
,它们可以传递给GEMM的cuda实现并转换到设备上.我可以使用这些示例来处理方形矩阵.但是,我无法弄清楚如何gemm_v2
使用非方形输入矩阵.有没有办法使用非正方形的C阶输入矩阵?
注意:
理想情况下,在调用GEMM以用于其他计算之后,输入和输出矩阵都将保留在设备上(这是迭代方法的一部分).
对不起,如果没有得到答案,我不知道重新提问的协议.几个月前在这里提出这个问题:2d数组中的指数对之间的Numpy和
我有一个2-d numpy数组(MxN)和另外两个1-d数组(Mx1),它们代表我想要总结的2-d数组的每一行的起始和结束索引.我正在寻找在大型阵列中执行此操作的最有效方法(最好不必使用循环,这是我目前正在做的事情).我想做的一个例子如下.
>>> random.seed(1234)
>>> a = random.rand(4,4)
>>> print a
[[ 0.19151945 0.62210877 0.43772774 0.78535858]
[ 0.77997581 0.27259261 0.27646426 0.80187218]
[ 0.95813935 0.87593263 0.35781727 0.50099513]
[ 0.68346294 0.71270203 0.37025075 0.56119619]]
>>> b = array([1,0,2,1])
>>> c = array([3,2,4,4])
>>> d = empty(4)
>>> for i in xrange(4):
d[i] = sum(a[i, b[i]:c[i]])
>>> print d
[ 1.05983651 1.05256841 0.8588124 1.64414897]
Run Code Online (Sandbox Code Playgroud)
我的问题类似于以下问题,但是,我不认为那里提出的解决方案会非常有效.在索引对之间的子阵列中的Numpy值的总和在该问题中,他们想要找到同一行的多个子集的总和,因此cumsum()
可以使用.但是,我只会在每行中找到一个总和,所以我认为这不是计算总和的最有效方法.
我正在尝试找到最快的方法来为二维排序数组的每一行找到第一个非零值.从技术上讲,数组中唯一的值是0和1,并且它是"已排序"的.
例如,数组可能如下所示:
v =
0 0 0 1 1 1 1
0 0 0 1 1 1 1
0 0 0 0 1 1 1
0 0 0 0 0 0 1
0 0 0 0 0 0 1
0 0 0 0 0 0 1
0 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
我可以使用argmax功能
argmax(v, axis=1))
Run Code Online (Sandbox Code Playgroud)
找到它从零变为一,但我相信这将在每一行进行详尽的搜索.我的阵列大小合适(~2000x2000).argmax是否仍然优于仅针对for循环中的每一行执行搜索排序方法,还是有更好的选择?
此外,数组总是这样,一行的第一个位置总是> =它上面一行中的第一个位置(但不保证最后几行中会有一个) ).我可以利用for循环和每个行的"起始索引值"来利用它,它等于前一行中前一个1的位置,但我认为numpy argmax函数仍然胜过用python编写的循环.
我只是对备选方案进行基准测试,但阵列的边长可能会发生很大变化(从250到10,000).
我需要一种使用具有混合(异构)dtypes的numpy数组有效存储(大小和读取速度)数据的方法。想象一个具有100M观测值的数据集,每个观测值有5个变量(其中3个是int32,而2个是float32)。
我目前将数据存储在两个gzip压缩的.npy文件中,一个用于ints,一个用于float:
import numpy as np
import gzip as gz
with gz.open('array_ints.npy.gz', 'wb') as fObj:
np.save(fObj, int_ndarray)
with gz.open('array_floats.npy.gz', 'wb') as fObj:
np.save(fObj, flt_ndarray)
Run Code Online (Sandbox Code Playgroud)
我也尝试过将数据存储为结构化数组,但最终文件大小大约比分别存储int和float的组合大小大25%。我的数据正在扩展到TB范围,因此我正在寻找最有效的存储方式(但我想避免将压缩算法更改为LZMA之类的东西)。
还有另一种方法可以将不同的数据类型有效地存储在一起,以便我可以同时读取两者吗?我开始研究HD5,但不确定是否有帮助。
编辑:
最终,我最终以h5py顺应了HD5路线。相对于gzip压缩的.npy数组,使用h5py我实际上看到大小减少了25%。但是,这可以归因于混洗过滤器。但是,将两个数组保存在同一文件中时,相对于保存单个文件,实际上没有任何开销。
我意识到最初的问题过于笼统,如果没有具体的数据格式和代表性样本(我无法真正透露),就无法给出足够的答案。因此,我要结束这个问题。
我正在尝试传递一个2d数组的排序值和一个值的数组,searchsorted
并让它返回一个相应的1d索引值数组.我必须多次执行此操作,并且我正在尝试找到一种有效的方法.最后,我想传递一个沿着轴排序的3d数组值,一个2d数组值来搜索并让函数返回一个2d索引数组.
这里有一个 MLE
from numpy import *
random.seed(1234)
a = zeros((4,10))
a[:,1:-1] = random.rand(4,8)
a[:,1:-1].sort(1)
a[:,-1] = 1.
v = random.rand(4)
res = array([searchsorted(a[j], v[j]) for j in xrange(4)])
Run Code Online (Sandbox Code Playgroud)
res
应该在哪里[9,1,7,6]
有没有一种有效的方法来做到这一点?理想情况下,我想尽可能避免使用Cython.如果它有帮助,搜索的每个数组应该有9-10个元素,而搜索的值的数量更大(100-1000个元素),因此传递的2d数组的大小为1000x10.
编辑修正了MLE中的拼写错误
我正在分析一些代码,但无法找出性能差异。我正在尝试在两个数组之间进行简单的按元素相加(就地)。这是使用 numba 的 CUDA 内核:
from numba import cuda
@cuda.jit('void(float32[:], float32[:])')
def cuda_add(x, y):
ix = cuda.threadIdx.x + cuda.blockIdx.x * cuda.blockDim.x
stepSize = cuda.gridDim.x * cuda.blockDim.x
while ix < v0.shape[0]:
y[ix] += x[ix]
ix += stepSize
Run Code Online (Sandbox Code Playgroud)
我认为性能还不错,但后来我将其与 cuBLAS 方法进行了比较:
from accelerate.cuda.blas import Blas
blas = Blas()
blas.axpy(1.0, X, Y)
Run Code Online (Sandbox Code Playgroud)
对于大型数组(20M 元素),BLAS 方法的性能大约快 25%。这是在之前通过调用内核“预热”内核之后进行的cuda.jit
,因此编译后的 PTX 代码已经被缓存(不确定这是否重要,但这样做只是为了确保这不是问题)。
我可以理解 3 级矩阵-矩阵运算的性能差异,但这是一个简单的添加。我可以做些什么来从 cuda.jit 代码中挤出更多性能吗?我这样问是因为我想要优化的真正代码是一个二维数组,它无法传递给 blas.axpy。
编辑执行代码和其他所需的包:
import numpy as np
def main():
n = 20 * 128 * 128 * 64 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 gzip 模块有效地读入和解析压缩文本文件。此链接建议使用 包装 gzip 文件对象io.BufferedReader
,如下所示:
import gzip, io
gz = gzip.open(in_path, 'rb')
f = io.BufferedReader(gz)
for line in f.readlines():
# do stuff
gz.close()
Run Code Online (Sandbox Code Playgroud)
要在 Python 3 中执行此操作,我认为gzip
必须使用mode='rb'
. 所以结果是这line
是一个二进制字符串。但是,我需要line
是文本/ascii 字符串。是否有更有效的方法来使用 读取文件作为文本字符串BufferedReader
,或者我必须line
在 for 循环内进行解码?
在Python中*
使用map
内置函数时,有没有办法用习语解包元组?
理想情况下,我想做以下事情:
def foo(a, b):
return a**2 + b
x = [(1,2), (3,4), (5,6)]
results = map(foo, *x)
Run Code Online (Sandbox Code Playgroud)
结果会相等 [3, 13, 31]
我正在尝试找到一种有效的方法来计算python中从点到多边形的最近边缘的距离.我认为它的形状很完美,但它只计算点在多边形外的距离.我想过opencv,它有一个内置函数,但它需要整数坐标(我不能离散我的数据).多边形不保证是凸的.