我读过这篇文章,但我仍然不明白为什么矢量化代码更快.
在for循环中,我可以使用parfor进行并行计算.如果矢量化代码更快,是否意味着它会自动并行化?
@ hadley 在今天的答案中引用的关于功能的文章提示,我决定重新审视一个关于outer函数如何工作(或不工作)的持久性谜题.为什么会失败:
outer(0:5, 0:6, sum) # while outer(0:5, 0:6, "+") succeeds
Run Code Online (Sandbox Code Playgroud)
这显示了我认为outer 应该如何处理如下函数sum:
Outer <- function(x,y,fun) {
mat <- matrix(NA, length(x), length(y))
for (i in seq_along(x)) {
for (j in seq_along(y)) {mat[i,j] <- fun(x[i],y[j])} }
mat}
> Outer(0:5, 0:6, `+`)
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 0 1 2 3 4 5 6
[2,] 1 2 3 4 5 6 7
[3,] 2 3 4 5 …Run Code Online (Sandbox Code Playgroud) 如果我有一个带有列x的数据帧df,并希望在伪代码中使用此值基于x的值创建列y
if df['x'] <-2 then df['y'] = 1
else if df['x'] > 2 then df['y']= -1
else df['y'] = 0
Run Code Online (Sandbox Code Playgroud)
我将如何实现这一目标.我认为np.where是最好的方法,但不知道如何正确编码.
是否有适用reduce于熊猫系列的模拟?
例如,对于模拟map是pd.Series.apply,但我无法找到任何模拟reduce.
我的申请是,我有一个大熊猫系列清单:
>>> business["categories"].head()
0 ['Doctors', 'Health & Medical']
1 ['Nightlife']
2 ['Active Life', 'Mini Golf', 'Golf']
3 ['Shopping', 'Home Services', 'Internet Servic...
4 ['Bars', 'American (New)', 'Nightlife', 'Loung...
Name: categories, dtype: object
Run Code Online (Sandbox Code Playgroud)
我想将这些系列列表合并在一起使用reduce,如下所示:
categories = reduce(lambda l1, l2: l1 + l2, categories)
Run Code Online (Sandbox Code Playgroud)
但这需要花费可怕的时间,因为将两个列表合并在一起就是O(n)Python的时间.我希望pd.Series有一种矢量化的方式来更快地执行此操作.
我想计算numpy ndarray的元素平均值.
In [56]: a = np.array([10, 20, 30])
In [57]: b = np.array([30, 20, 20])
In [58]: c = np.array([50, 20, 40])
Run Code Online (Sandbox Code Playgroud)
我想要的是:
[30, 20, 30]
Run Code Online (Sandbox Code Playgroud)
除了矢量化和和除以外,是否有任何内置函数用于此操作?
我正在尝试加速/矢量化时间序列中的一些计算.我可以在for循环中矢量化计算,这可能取决于早期迭代的结果吗?例如:
z <- c(1,1,0,0,0,0)
zi <- 2:6
for (i in zi) {z[i] <- ifelse (z[i-1]== 1, 1, 0) }
Run Code Online (Sandbox Code Playgroud)
使用前面步骤中更新的z [i]值:
> z
[1] 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)
在我的努力中矢量化这个
z <- c(1,1,0,0,0,0)
z[zi] <- ifelse( z[zi-1] == 1, 1, 0)
Run Code Online (Sandbox Code Playgroud)
逐个元素的操作不使用操作中更新的结果:
> z
[1] 1 1 1 0 0 0
Run Code Online (Sandbox Code Playgroud)
因此,这种向量化操作以"并行"而非迭代方式运行.有没有办法我可以写/向量化这个来获得for循环的结果?
我试图说服gccgo没有成功矢量化以下片段:
package foo
func Sum(v []float32) float32 {
var sum float32 = 0
for _, x := range v {
sum += x
}
return sum
}
Run Code Online (Sandbox Code Playgroud)
我正在验证由以下内容生成的程序集:
$ gccgo -O3 -ffast-math -march=native -S test.go
Run Code Online (Sandbox Code Playgroud)
gccgo版本是:
$ gccgo --version
gccgo (Ubuntu 4.9-20140406-0ubuntu1) 4.9.0 20140405 (experimental) [trunk revision 209157]
Run Code Online (Sandbox Code Playgroud)
是不是gccgo应该能够对这段代码进行矢量化?具有相同gcc选项的等效C代码完全使用AVX指令进行矢量化...
UPDATE
在这里你有相应的C例子:
#include <stdlib.h>
float sum(float *v, size_t n) {
size_t i;
float sum = 0;
for(i = 0; i < n; i++) {
sum += v[i];
}
return sum;
} …Run Code Online (Sandbox Code Playgroud) 我在OpenCV中阅读了一些关于多线程的文章和帖子:
但我无法得到一致的答案,哪种多线程方法是正确的方法.
关于TBB,2012年的答案有5个赞成票:
使用WITH_TBB = ON时,OpenCV会尝试使用多个线程来执行某些功能.问题是目前只有一个功能强大的TBB(可能是十几个).所以,很难看到任何加速.这里的OpenCV理念是应用程序应该是多线程的,而不是OpenCV函数.[...]
关于应用程序级别的多线程,主持人对answers.opencv.org的评论:
请避免在opencv中使用自己的多线程.很多函数显然不是线程安全的.而是使用TBB或openmp支持重建opencv库.
但有3个赞成票的另一个答案是:
库本身是线程安全的,因为您可以同时多次调用库,但数据并不总是线程安全的.
所以我认为在应用程序级别上使用(多)线程至少是可以的.但是,当我的程序运行较长时间时,我遇到了奇怪的性能问题.
在研究了这些性能问题之后,我创建了这个最小,完整且可验证的示例代码:
#include "opencv2\opencv.hpp"
#include <vector>
#include <chrono>
#include <thread>
using namespace cv;
using namespace std;
using namespace std::chrono;
void blurSlowdown(void*) {
Mat m1(360, 640, CV_8UC3);
Mat m2(360, 640, CV_8UC3);
medianBlur(m1, m2, 3);
}
int main()
{
for (;;) {
high_resolution_clock::time_point start = high_resolution_clock::now();
for (int k = 0; k < 100; k++) {
thread t(blurSlowdown, nullptr);
t.join(); …Run Code Online (Sandbox Code Playgroud) norm在MATLAB中调用矩阵时,它返回所谓的"矩阵范数"(标量值),而不是矢量范数数组.有没有办法在没有循环的情况下获得矩阵中每个向量的范数并利用MATLAB的向量化?
我在MATLAB中有一个函数,它执行Gram-Schmidt正交化,并对内积进行了非常重要的加权(我不认为MATLAB的内置函数支持这一点).据我所知,这个功能效果很好,但是在大型矩阵上它太慢了.改善这种情况的最佳方法是什么?
我已经尝试转换为MEX文件,但我失去了与我正在使用的编译器的并行化,因此它更慢.
我想在GPU上运行它,因为元素倍增是高度并行化的.(但我更喜欢实现方便携带)
任何人都可以将此代码矢量化或加快速度吗?我不确定如何优雅地做到这一点......
我知道这里的stackoverflow思想是惊人的,认为这是一个挑战:)
function [Q, R] = Gram_Schmidt(A, w)
[m, n] = size(A);
Q = complex(zeros(m, n));
R = complex(zeros(n, n));
v = zeros(n, 1);
for j = 1:n
v = A(:,j);
for i = 1:j-1
R(i,j) = sum( v .* conj( Q(:,i) ) .* w ) / ...
sum( Q(:,i) .* conj( Q(:,i) ) .* w );
v = v - R(i,j) * Q(:,i);
end
R(j,j) = norm(v);
Q(:,j) = v / R(j,j);
end …Run Code Online (Sandbox Code Playgroud) optimization performance matlab linear-algebra vectorization