python – C – argsort低效率的矢量版本实现与numpy中的低效率相比
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – C – argsort低效率的矢量版本实现与numpy中的低效率相比,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2772字,纯文字阅读大概需要4分钟。
内容图文
![python – C – argsort低效率的矢量版本实现与numpy中的低效率相比](/upload/InfoBanner/zyjiaocheng/789/5a29bad2058147d79524937ef7459538.jpg)
这是我做的比较. np.argsort定时在float32上,ndarray由1,000,000个元素组成.
In [1]: import numpy as np
In [2]: a = np.random.randn(1000000)
In [3]: a = a.astype(np.float32)
In [4]: %timeit np.argsort(a)
86.1 ms ± 1.59 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
这里有一个C程序执行相同的过程,但是在引用this answer的向量上.
#include <iostream>
#include <vector>
#include <cstddef>
#include <algorithm>
#include <opencv2/opencv.hpp>
#include <numeric>
#include <utility>
int main()
{
std::vector<float> numbers;
for (int i = 0; i != 1000000; ++i) {
numbers.push_back((float)rand() / (RAND_MAX));
}
double e1 = (double)cv::getTickCount();
std::vector<size_t> idx(numbers.size());
std::iota(idx.begin(), idx.end(), 0);
std::sort(idx.begin(), idx.end(), [&numbers](const size_t &a, const size_t &b)
{ return numbers[a] < numbers[b];});
double e2 = (double)cv::getTickCount();
std::cout << "Finished in " << 1000 * (e2 - e1) / cv::getTickFrequency() << " milliseconds." << std::endl;
return 0;
}
它打印完成时间为525.908毫秒.它比numpy版慢得多.所以有人能解释是什么让np.argsort这么快吗?谢谢.
Edit1:np .__ version__返回1.15.0,它运行在Python 3.6.6 | Anaconda自定义(64位)和g – 版本打印8.2.0.操作系统是Manjaro Linux.
Edit2:我用g中的-O2和-O3标志进行编译,得到的结果是216.515毫秒和205.017毫秒.这是一个改进,但仍然比numpy版本慢. (Referring to this question)这被删除了,因为我错误地运行了测试,我的笔记本电脑的DC适配器已拔下,这会导致它变慢.在公平竞争中,C阵列和矢量版本的表现相同(约需100ms).
Edit3:另一种方法是用C代替数组:vector numbers [1000000] ;.之后,运行时间约为100毫秒(/ -5毫秒).完整代码:
#include <iostream>
#include <vector>
#include <cstddef>
#include <algorithm>
#include <opencv2/opencv.hpp>
#include <numeric>
#include <utility>
int main()
{
//std::vector<float> numbers;
float numbers[1000000];
for (int i = 0; i != 1000000; ++i) {
numbers[i] = ((float)rand() / (RAND_MAX));
}
double e1 = (double)cv::getTickCount();
std::vector<size_t> idx(1000000);
std::iota(idx.begin(), idx.end(), 0);
std::sort(idx.begin(), idx.end(), [&numbers](const size_t &a, const size_t &b)
{ return numbers[a] < numbers[b];});
double e2 = (double)cv::getTickCount();
std::cout << "Finished in " << 1000 * (e2 - e1) / cv::getTickFrequency() << " milliseconds." << std::endl;
return 0;
}
解决方法:
我接受了你的实施并用10000000项测量它.花了大约1.7秒.
现在我介绍了一堂课
class valuePair {
public:
valuePair(int idx, float value) : idx(idx), value(value){};
int idx;
float value;
};
with初始化为
std::vector<valuePair> pairs;
for (int i = 0; i != 10000000; ++i) {
pairs.push_back(valuePair(i, (double)rand() / (RAND_MAX)));
}
和排序比完成
std::sort(pairs.begin(), pairs.end(), [&](const valuePair &a, const valuePair &b) { return a.value < b.value; });
此代码将运行时间缩短至1.1秒.这是我认为由于更好的缓存一致性,但仍然离python结果相当远.
内容总结
以上是互联网集市为您收集整理的python – C – argsort低效率的矢量版本实现与numpy中的低效率相比全部内容,希望文章能够帮你解决python – C – argsort低效率的矢量版本实现与numpy中的低效率相比所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。