我想比较使用Python和C++从stdin读取字符串的读取行,并且看到我的C++代码运行速度比等效的Python代码慢一个数量级,这让我很震惊.由于我的C++生锈了,我还不是专家Pythonista,请告诉我,如果我做错了什么或者我是否误解了什么.
(TLDR回答:包括声明:cin.sync_with_stdio(false)或者只是fgets改用.
TLDR结果:一直向下滚动到我的问题的底部并查看表格.)
C++代码:
#include <iostream>
#include <time.h>
using namespace std;
int main() {
string input_line;
long line_count = 0;
time_t start = time(NULL);
int sec;
int lps;
while (cin) {
getline(cin, input_line);
if (!cin.eof())
line_count++;
};
sec = (int) time(NULL) - start;
cerr << "Read " << line_count << " lines in " << sec << " seconds.";
if (sec > 0) {
lps = line_count / sec;
cerr << " LPS: " << lps …Run Code Online (Sandbox Code Playgroud) 我正在使用python(Django Framework)来读取CSV文件.如您所见,我只从这个CSV中拉出2行.我一直想做的是在变量中存储CSV的总行数.
如何获得总行数?
file = object.myfilePath
fileObject = csv.reader(file)
for i in range(2):
data.append(fileObject.next())
Run Code Online (Sandbox Code Playgroud)
我试过了:
len(fileObject)
fileObject.length
Run Code Online (Sandbox Code Playgroud) 快速搜索给了我tawbaware wc,但它不接受stdout作为输入流,这意味着我不能在DOS会话中使用管道.
注意:
我无法安装cygwin或使用powershell(这将允许' |foreach-object {(get-content $_).count}')
例如,如果我的文本文件是:
blue
green
yellow
black
Run Code Online (Sandbox Code Playgroud)
这里有四行,现在我想得到四个结果.我怎样才能做到这一点?
我现在有一个非常简单的脚本,它使用以下方法计算文本文件中的行enumerate():
i = 0
f = open("C:/Users/guest/Desktop/file.log", "r")
for i, line in enumerate(f):
pass
print i + 1
f.close()
Run Code Online (Sandbox Code Playgroud)
这需要大约3分半钟才能完成大约3000万行的15GB日志文件.如果我能在两分钟或更短的时间内得到它,那将是很好的,因为这些是每日日志,我们想要进行每月分析,因此代码必须处理30个~15GB的日志 - 可能超过一个半小时,我们希望尽量减少服务器上的时间和内存负载.
我也会接受一个很好的近似/估计方法,但它需要大约4 sig fig准确...
谢谢!
我可能犯了一个愚蠢的错误,但我找不到它的位置.我想计算我的csv文件中的行数.我写了这个,显然不起作用:我row_count = 0应该是400.干杯.
f = open(adresse,"r")
reader = csv.reader(f,delimiter = ",")
data = [l for l in reader]
row_count = sum(1 for row in reader)
print row_count
Run Code Online (Sandbox Code Playgroud) 考虑这个python程序:
import sys
lc = 0
for line in open(sys.argv[1]):
lc = lc + 1
print lc, sys.argv[1]
Run Code Online (Sandbox Code Playgroud)
在我的6GB文本文件上运行它,它在~2分钟内完成.
问题:是否有可能加快速度?
请注意,同一时间需要:
wc -l myfile.txt
Run Code Online (Sandbox Code Playgroud)
所以,我怀疑对我的问题的回答只是一个简单的"不".
另请注意,我的真实程序正在做一些比计算线条更有趣的事情,所以请给出一个通用答案,而不是行计数技巧(比如在文件中保留行数元数据)
PS:我在这个问题上标记了"linux",因为我只对linux特定的答案感兴趣.如果有的话,请随意提供与操作系统无关的内容,甚至是其他操作系统的答案.
另见后续问题
一些方法可以做到这一点:
df.tailnrows参数来读取skiprows并读取所需的行数.可以用更简单的方式完成吗?如果不是,应该优先考虑这三者中的哪一个?为什么?
可能相关:
没有直接关系:
执行.shape会给我以下错误.
AttributeError:'DataFrame'对象没有属性'shape'
我应该如何获得形状呢?
在Python 2中,文件对象有一个xreadlines()方法,它返回一个迭代器,一次读取一行文件.在Python 3中,xreadlines()方法不再存在,而realines()仍然返回一个列表(不是迭代器).Python 3有类似于xreadlines()的东西吗?
我知道我能做到
for line in f:
Run Code Online (Sandbox Code Playgroud)
代替
for line in f.xreadlines():
Run Code Online (Sandbox Code Playgroud)
但我还想使用没有for循环的xreadlines():
print(f.xreadlines()[7]) #read lines 0 to 7 and prints line 7
Run Code Online (Sandbox Code Playgroud) python ×9
csv ×3
count ×2
benchmarking ×1
c++ ×1
cmd ×1
dask ×1
enumerate ×1
file ×1
file-io ×1
getline ×1
iostream ×1
iterator ×1
line-count ×1
linux ×1
numpy ×1
pandas ×1
performance ×1
python-3.x ×1
readlines ×1
row ×1
sum ×1
text-files ×1
windows ×1