ascii_lower
andchoice
の代わりにstring
and をインポートするとrandom
、実行時間が短縮されます。
ステートメントを使用しwith
てファイルを開くと、実行時間がわずかに増加する原因のようです。
7000 行 (私のコードでは 7000000 の代わりにこの番号を使用しました) を書く代わりに、最後のコードのアイデアは\n
、ファイルにこの文字列を出力する前にリンクされている文字列内の行数をグループ化することです。
そうすることで、 への呼び出し回数print()
が減ります。
行の総数の約数ではないグループ化された行の数と同じ総行数を取得するには、for ループと xrange でいくつかのトリッキーな計算を行う必要があります (コードを見て理解することをお勧めします)。 .
また、1024 の倍数でありながら、複数の行をグループ化する文字列のビット数と等しくなるようにバッファー サイズを選択しました
。ファイルの各行には 10 文字が含まれている必要があります。グループ化された行は で連結されます\n
--> 11 文字になります。\n
最後にグループ化された行の後にはありませんが、print()
動作するときにそのような文字が追加され`\n
ます。
したがって、グループ化されたn行の場合、グループ化文字列にはn * 11 文字があります。文字==8 ビットとして、n *11*8 = n *88 とします。次に n を見つけるのは簡単です: nを検証する必要があります*88 = buffer_size。buffer_size の 1024 の倍数と 88 の倍数を同時に取得する必要があります。
編集
バッファのサイズを調整しようとしてもメリットがないようです。
from __future__ import print_function
from time import clock
from os.path import getsize
N=10
A,B,C,D,E,F = [],[],[],[],[],[]
repet = 20
total_lines = 7000
.
import random
import string
for i in xrange(repet):
te = clock()
rand_file1 = open("file_name1", 'w')
for i in range(total_lines):
print(''.join(random.choice(string.ascii_lowercase)
for x in range(N)),
file=rand_file1)
rand_file1.close()
A.append(clock()-te)
.
import random
import string
for i in xrange(repet):
te = clock()
with open("file_name2", 'w') as rand_file2:
for i in range(total_lines):
print(''.join(random.choice(string.ascii_lowercase)
for x in range(N)),
file=rand_file2)
B.append(clock()-te)
.
import random
from string import ascii_lowercase
for i in xrange(repet):
te = clock()
rand_file3 = open("file_name3", 'w')
for i in range(total_lines):
print(''.join(random.choice(ascii_lowercase)
for x in range(N)),
file=rand_file3)
rand_file3.close()
C.append(clock()-te)
.
from random import choice
from string import ascii_lowercase
for i in xrange(repet):
te = clock()
rand_file4 = open("file_name4", 'w')
for i in range(total_lines):
print(''.join(choice(ascii_lowercase)
for x in range(N)),
file=rand_file4)
rand_file4.close()
D.append(clock()-te)
.
from random import choice
from string import ascii_lowercase
buffer_size = 22528
grouped_lines = buffer_size/(11*8)
for i in xrange(repet):
te = clock()
rand_file5 = open("file_name5", 'w') # <== no buffer's size adjusted here
for i in range(0, total_lines, grouped_lines):
u = '\n'.join(''.join(choice(ascii_lowercase)
for x in range(N))
for y in xrange(min(grouped_lines,total_lines-i)))
print(u,file=rand_file5)
rand_file5.close()
E.append(clock()-te)
.
from random import choice
from string import ascii_lowercase
buffer_size = 22528
grouped_lines = buffer_size/(11*8)
for i in xrange(repet):
te = clock()
rand_file6 = open("file_name6", 'w', buffer_size)
for i in range(0, total_lines, grouped_lines):
u = '\n'.join(''.join(choice(ascii_lowercase)
for x in range(N))
for y in xrange(min(grouped_lines,total_lines-i)))
print(u,file=rand_file6)
rand_file6.close()
F.append(clock()-te)
.
t1,t2,t3,t4,t5,t6=map(min,(A,B,C,D,E,F))
print ('1 %s\n'
'2 %s %.3f %%\n'
'3 %s %.3f %%\n'
'4 %s %.3f %%\n'
'5 %s %.3f %%\n'
'6 %s %.3f %%\n'
% (t1,
t2,t2/t1*100,
t3,t3/t1*100,
t4,t4/t1*100,
t5,t5/t1*100,
t6,t6/t1*100))
for y in xrange(880,100000,88):
if y%1024==0:
print('%d %% 88 == %d %d %% 1024 == %d'
% (y,y%88,y,y%1024))
print("\nfile_name1",getsize('file_name1'))
for fn in ("file_name2","file_name3",
"file_name4","file_name5",
"file_name6"):
print(fn,getsize(fn))
結果
1 0.492455605391
2 0.503463149646 102.235 %
3 0.475755717556 96.609 %
4 0.449807168229 91.340 %
5 0.319271024669 64.832 %
6 0.334138277351 67.851 %
11264 % 88 == 0 11264 % 1024 == 0
22528 % 88 == 0 22528 % 1024 == 0
33792 % 88 == 0 33792 % 1024 == 0
45056 % 88 == 0 45056 % 1024 == 0
56320 % 88 == 0 56320 % 1024 == 0
67584 % 88 == 0 67584 % 1024 == 0
78848 % 88 == 0 78848 % 1024 == 0
90112 % 88 == 0 90112 % 1024 == 0
file_name1 84000
file_name2 84000
file_name3 84000
file_name4 84000
file_name5 84000
file_name6 84000