- чтение CSV с помощью RapidCSV — 3,2 секунды ( pandas.read_csv — 4,8 секунды)
- запись 3D-данных с помощью Eigen::Tensor со значениями из других столбцов, выступающих в качестве индексов — 18,4 секунды (DataFrame.pivot — 1,8 секунды) )
- Основная функция — 0,9 секунды (с pandas.DataFrame — более 1 часа)
- Должен ли я использовать некоторые пакеты, которые оптимизируют сводку данных с помощью специального класса табличных данных? Есть ли у кого-нибудь рекомендации из своей практики?
- Есть ли возможность оптимизации в алгоритме свода данных? Лучший контейнер поиска для поиска по индексу? Меньше промежуточного использования памяти? Или лучший алгоритм для сведения данных?
auto start = std::chrono::high_resolution_clock::now();
rapidcsv::Document doc(filename);
// Stop timing
auto stop = std::chrono::high_resolution_clock::now();
// Calculate the duration
auto duration = std::chrono::duration_cast(stop - start);
logInfo("Time taken by function {}: {} seconds", "rapidcsv read csv", duration.count()/1000000.0);
std::vector datetime_col = doc.GetColumn(datetime_col_name);
std::vector category_col = doc.GetColumn(category_col_name);
std::set unique_datetime(datetime_col.begin(),
datetime_col.end());
std::set unique_security(category_col.begin(),
category_col.end());
BidirectionalMap datetime_axis;
for (auto dt: unique_datetime){
datetime_axis.insert(TradeTime(dt));
}
BidirectionalMap category_axis(unique_category);
BidirectionalMap feature_axis(feature_col_names);
Eigen::Tensor feature_data(datetime_axis.getSize(), security_axis.getSize(), feature_axis.getSize());
// build mapping
std::vector fea_col_index;
fea_col_index.resize(feature_col_names.size());
for(auto fea_col: feature_col_names){
fea_col_index.push_back(feature_axis.getKey(fea_col));
}
start = std::chrono::high_resolution_clock::now();
for(int i=0; ilocator = 0;
};
template
BidirectionalMap(const Container& values) {
this->locator = 0;
for (const auto& value : values) {
this->insert(value);
}
}
int getKey(const Value& value) const {
return this->valueToKey.at(value);
}
Value getValue(const int& key) const {
return this->keyToValue.at(key);
}
int insert(const Value& value) {
// Check if the key already exists
if(this->valueToKey.find(value) != this->valueToKey.end()){
return this->valueToKey.at(value);
}
this->keyToValue[this->locator] = value;
this->valueToKey[value] = this->locator;
++this->locator;
return this->locator-1;
}
int getSize() const {
return this->locator;
}
};
Подробнее здесь: https://stackoverflow.com/questions/787 ... ation-in-c
Мобильная версия