Может ли C ++ программировать поиск строк так же быстро и / или быстрее, чем Python?

Я не уверен, почему в программе, написанной на python, поиск по временным строкам стал проще, чем у программы на C ++. Есть трюк, который я пропускаю?

Создание варианта использования

Это для случая использования одной строки, однако в реальном случае использования я забочусь о нескольких строках.

#include "tchar.h"#include "stdio.h"#include "stdlib.h"#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
#include <ctime>

using namespace std;
void main(void){
ofstream testfile;
unsigned int line_idx = 0;
testfile.open("testfile.txt");
for(line_idx = 0; line_idx < 50000u; line_idx++)
{
if(line_idx != 43268u )
{
testfile << line_idx << " dontcare" << std::endl;
}
else
{
testfile << line_idx << " care" << std::endl;
}
}
testfile.close();
}

Регулярное выражение
Используя регулярное выражение ^(\d*)\s(care)$

Программа C ++ занимает 13,954 секунды

#include "tchar.h"#include "stdio.h"#include "stdlib.h"#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
#include <ctime>
using namespace std;

void main(void){
double duration;
std::clock_t start;
ifstream testfile("testfile.txt", ios_base::in);
unsigned int line_idx = 0;
bool found = false;
string line;
regex ptrn("^(\\d*)\\s(care)$");

start = std::clock();   /* Debug time */
while (getline(testfile, line))
{
std::smatch matches;
if(regex_search(line, matches, ptrn))
{
found = true;
}
}
testfile.close();
duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
std::cout << "Found? " << (found ? "yes" : "no") << std::endl;
std::cout << " Total time: " <<  duration << std::endl;
}

Программа Python занимает 0.02200 секунд

import sys, os       # to navigate and open files
import re            # to search file
import time          # to benchmark

ptrn  = re.compile(r'^(\d*)\s(care)$', re.MULTILINE)

start = time.time()
with open('testfile.txt','r') as testfile:
filetext = testfile.read()
matches = re.findall(ptrn, filetext)
print("Found? " + "Yes" if len(matches) == 1 else "No")

end = time.time()
print("Total time", end - start)

2

Решение

Выполнена рекомендация Раты 8.923

улучшение примерно на 5 секунд путем чтения файла в одну строку

   double duration;
std::clock_t start;
ifstream testfile("testfile.txt", ios_base::in);
unsigned int line_idx = 0;
bool found = false;
string line;
regex ptrn("^(\\d*)\\s(care)$");
std::smatch matches;

start = std::clock();   /* Debug time */
std::string test_str((std::istreambuf_iterator<char>(testfile)),
std::istreambuf_iterator<char>());

if(regex_search(test_str, matches, ptrn))
{
found = true;
}
testfile.close();
duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
std::cout << "Found? " << (found ? "yes" : "no") << std::endl;
std::cout << " Total time: " <<  duration << std::endl;

После примечания UKMonkey, реконфигурированный проект для выпуска, который также включает \ O2 и снизил его до 0,086 секунд

Благодаря Жан-Франсуа Фабр, Рата, Великобритания, Монки

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]