免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
python – C – argsort低效率的矢量版本實現(xiàn)與numpy中的低效率相比

這是我做的比較. np.argsort定時在float32上,ndarray由1,000,000個元素組成.

In [1]: import numpy as npIn [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程序執(zhí)行相同的過程,但是在引用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.操作系統(tǒng)是Manjaro Linux.

Edit2:我用g中的-O2和-O3標志進行編譯,得到的結(jié)果是216.515毫秒和205.017毫秒.這是一個改進,但仍然比numpy版本慢. (Referring to this question)這被刪除了,因為我錯誤地運行了測試,我的筆記本電腦的DC適配器已拔下,這會導(dǎo)致它變慢.在公平競爭中,C陣列和矢量版本的表現(xiàn)相同(約需100ms).

Edit3:另一種方法是用C代替數(shù)組: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秒.

現(xiàn)在我介紹了一堂課

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結(jié)果相當(dāng)遠.

來源:https://www.icode9.com/content-1-272551.html
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
PCL中使用FLANN庫(2)
python科學(xué)計算-Numpy包使用
Numpy 的一些以 arg 開頭的函數(shù)
Numpy 中不得不知的4個重要函數(shù)
Python數(shù)據(jù)分析庫-Numpy庫在數(shù)據(jù)分析中的知識點(三)
第89天:NumPy 排序和篩選函數(shù)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服