- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将我之前用 python 编写的一些代码转移到 C++ 中,并且我目前正在测试 xtensor 以查看它是否可以比 numpy 更快地完成我需要的操作。
我的一个函数采用方阵 d 和标量 alpha,并执行元素操作 alpha/(alpha+d)
.背景:该函数用于测试alpha
的哪个值是“最好的”,所以它处于一个循环中,其中 d
始终相同,但 alpha
各不相同。
以下所有时间尺度都是运行该函数的 100 个实例的平均值。
在numpy中,大约需要0.27秒,代码如下:
def kfun(d,alpha):
k = alpha /(d+alpha)
return k
但是 xtensor 大约需要 0.36 秒,代码如下所示:
xt::xtensor<double,2> xk(xt::xtensor<double,2> d, double alpha){
return alpha/(alpha+d);
}
我还使用
std::vector
尝试了以下版本但这是我不想长期使用的东西,即使只花了 0.22 秒。
std::vector<std::vector<double>> kloops(std::vector<std::vector<double>> d, double alpha, int d_size){
for (int i = 0; i<d_size; i++){
for (int j = 0; j<d_size; j++){
d[i][j] = alpha/(alpha + d[i][j]);
}
}
return d;
}
我注意到
operator/
在 xtensor 中使用“延迟广播”,有没有办法让它立即生效?
t0 = time.time()
for i in range(100):
kk = k(dsquared,alpha_squared)
print(time.time()-t0)
在 C++ 中,我调用函数如下,并使用 chronos 计时:
//d is saved as a 1D npy file, an artefact from old code
auto sd2 = xt::load_npy<double>("/path/to/d.npy");
shape = {7084, 7084};
xt::xtensor<double, 2> xd2(shape);
for (int i = 0; i<7084;i++){
for (int j=0; j<7084;j++){
xd2(i,j) = (sd2(i*7084+j));
}
}
auto start = std::chrono::steady_clock::now();
for (int i = 0;i<10;i++){
matrix<double> kk = kfun(xd2,4000*4000,7084);
}
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start;
std::cout << "k takes: " << elapsed_seconds.count() << "\n";
如果您想运行此代码,我建议您使用
xd2
作为对称的 7084x7084 随机矩阵,对角线上有零。
k
的矩阵,然后继续用于其他功能,但我仍然需要
d
保持不变,因为它将在以后重复使用。
cd "/path/to/src/" && g++ -mavx2 -ffast-math -DXTENSOR_USE_XSIMD -O3 ccode.cpp -o ccode -I/path/to/xtensorinclude && "/path/to/src/"ccode
提前致谢!
最佳答案
C++ 实现的一个问题可能是它创建了一个或什至可能是两个可以避免的临时拷贝。第一个拷贝来自没有通过引用(或完美转发)传递参数。如果不查看其余代码,很难判断这是否对性能有影响。编译器可能会移动d
如果保证在方法之后不被使用,进入方法xk()
,但更有可能将数据复制到d
.
要通过引用传递,该方法可以更改为
xt::xtensor<double,2> xk(const xt::xtensor<double,2>& d, double alpha){
return alpha/(alpha+d);
}
要使用完美转发(并启用其他 xtensor 容器,如
xt::xarray
或
xt::xtensor_fixed
),该方法可以更改为
template<typename T>
xt::xtensor<double,2> xk(T&& d, double alpha){
return alpha/(alpha+d);
}
此外,您可以避免为返回值保留内存。同样,如果没有看到其余的代码,很难判断。但是如果在循环内部使用该方法,并且返回值始终具有相同的形状,那么在循环外部创建返回值并通过引用返回可能会有所帮助。为此,该方法可以更改为:
template<typename T, typename U>
void xk(T& r, U&& d, double alpha){
r = alpha/(alpha+d);
}
如果保证
d
和
r
不要指向同一个内存,可以进一步换行
r
在
xt::noalias()
在分配结果之前避免临时拷贝。如果不按引用返回,函数的返回值也是如此。
关于python - xtensor 的 "operator/"比 numpy 的 "/"慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66689002/
我正在尝试使用 xtensor,这样我就可以从 Python 中使用它。然而,xtensor 的吸引力之一是它也很容易为 R 进行绑定(bind),因此编写一次算法,然后为 python 和 R 编写
我正在玩弄 xtensor,我只是想执行一个简单的操作来选择具有特定列值的行。假设我有以下数组。 [ [0, 1, 1, 3, 4 ] [0, 2, 1, 5, 6 ] [0, 3, 1,
在这里,我试图对C++中的xtensor库进行非常基本的操作。我有xarray a,并且有了index related function xt::where,我想获取条件为True的索引数组(请注意,
考虑以下程序: #include #include "xtensor/xarray.hpp" #include "xtensor/xio.hpp" #include "xtensor/xview.h
我正在使用 C++ 的 Xtensor 库。 我有一个 xt::zeros({n, n, 3}) 数组,我想为其 i, j, 元素分配一个 xt::xarray{ , , } 以便它存储 3D 维度每
我正在尝试从 caffe 库中的 blob 数据创建一个 xtensor 数组。使用 caffe 中的函数 mutable_cpu_data() 返回指向数据的指针,例如 float* data =
只需点击 xtensor,我喜欢它,我会尝试从 vba(excel)中使用它。 为了保持这个“测试”简单,我打算只使用 double 矩阵,它们作为 LPSAFEARRAY 传递给 C/C++ dll
假设我有一个张量: xt::xtensor_fixed, xt::layout_type::column_major> withnans = { {3, std::numeric_limits::q
xtensor 的文档提供了 numpy 功能的映射 ( link )。 该列表涵盖了许多用例,但我无法重新创建一项功能。我有一个 2D 张量,我想选择由在运行时构建的序列标识的特定行。我的理解是这阻
我在学习xtensor并希望获得与 NumPy 相同甚至更高的性能。但不幸的是,我不能也需要帮助。 我做了与 here 类似的基准测试: Performance of xtensor types vs
我正在尝试使用简单条件过滤 2D xtensor View 。我找到了 xt::filter 函数,但是当我使用它时,它只返回过滤 View 的第一列。我需要二维过滤 View 。最好的方法是什么?
复制view有没有类似numpy copy的功能?如果不是,那么深度复制复杂 View 的最简单方法是什么?复制构造函数仍然指向相同的内部值,这在大多数情况下都很好,但有时需要深复制。 最佳答案 如果
我正在尝试 xtensor-python在使用 cookiecutter setup 之后,开始编写一个非常简单的求和函数并使用 xsimd 启用 SIMD 内部函数. inline double s
我最近试图比较不同的 python 和 C++ 矩阵库的线性代数性能,以便了解在即将进行的项目中使用哪个。虽然有多种类型的线性代数运算,但我选择主要关注矩阵求逆,因为它似乎给出了奇怪的结果。我在下面编
标题说明了 - numpy 的 xtensor 等价物是什么 # set all elements > 3 to 1 sometensor[sometensor > 3] = 1 ? 它看起来像 xt
我是 xtensor 的新手。我想知道如何使用 xt::where 的输出。在 python 中,例如假设 imap 是一个 nd 数组, np.where(imap>=4) 返回两个带索引的数组,可
我有一个 2D xtensor View ,我想从中删除一条具有已知索引的线。使用 numpy,有 delete() 方法,使用它很容易做到。有没有类似的方法可以用 xtensor 做到这一点? 最佳
从 cpp 文件复制: #include #include #include #include #include using int8 = std::int8_t; template vo
我目前正在为一个应用程序使用 xtensor,我想包装张量以创建一个名为 BitArray 的类。 #include #include "xtensor/xarray.hpp" #include "
我正在尝试在 xarray 中查找某些数组值的索引值。我有一个名为 lattice 的 xarray,其中包含数字 1 到 n,我想要的是类似 auto x2 = xt::where(lattice
我是一名优秀的程序员,十分优秀!