2018-10-29 সম্পাদনা
মন্তব্য করার জন্য আপনাকে ধন্যবাদ।
গতির দিক দিয়ে CSV ফাইলে লাইনের সংখ্যা পেতে আমি বিভিন্ন ধরণের কোড পরীক্ষা করেছি। সেরা পদ্ধতি নীচে।
with open(filename) as f:
sum(1 for line in f)
এখানে কোড পরীক্ষা করা আছে।
import timeit
import csv
import pandas as pd
filename = './sample_submission.csv'
def talktime(filename, funcname, func):
print(f"# {funcname}")
t = timeit.timeit(f'{funcname}("{filename}")', setup=f'from __main__ import {funcname}', number = 100) / 100
print('Elapsed time : ', t)
print('n = ', func(filename))
print('\n')
def sum1forline(filename):
with open(filename) as f:
return sum(1 for line in f)
talktime(filename, 'sum1forline', sum1forline)
def lenopenreadlines(filename):
with open(filename) as f:
return len(f.readlines())
talktime(filename, 'lenopenreadlines', lenopenreadlines)
def lenpd(filename):
return len(pd.read_csv(filename)) + 1
talktime(filename, 'lenpd', lenpd)
def csvreaderfor(filename):
cnt = 0
with open(filename) as f:
cr = csv.reader(f)
for row in cr:
cnt += 1
return cnt
talktime(filename, 'csvreaderfor', csvreaderfor)
def openenum(filename):
cnt = 0
with open(filename) as f:
for i, line in enumerate(f,1):
cnt += 1
return cnt
talktime(filename, 'openenum', openenum)
ফলাফলটি নীচে ছিল।
# sum1forline
Elapsed time : 0.6327946722068599
n = 2528244
# lenopenreadlines
Elapsed time : 0.655304473598555
n = 2528244
# lenpd
Elapsed time : 0.7561274056295324
n = 2528244
# csvreaderfor
Elapsed time : 1.5571560935772661
n = 2528244
# openenum
Elapsed time : 0.773000013928679
n = 2528244
উপসংহারে, sum(1 for line in f)
দ্রুততম। তবে এর থেকে উল্লেখযোগ্য পার্থক্য নাও থাকতে পারে len(f.readlines())
।
sample_submission.csv
30.2MB এবং এটি 31 মিলিয়ন অক্ষর রয়েছে।
file_read
? এটি কি কোনও ফাইল হ্যান্ডেল (যেমন রয়েছেfile_read = open("myfile.txt")
?