Pythonの再帰、いくつかの眩しい技の使い方
17907 ワード
Pythonの再帰、いくつかの眩しい技の使い方
ある学習者はpythonの再帰実装を質問し、具体的なテーマは再帰的に、指定したディレクトリの下のすべてのファイルのsize統計を実現することです.自分で書いたら、この問題は面白いですね.
コードは次のとおりです.
まとめ
どこが見えるか忘れてしまいましたが、pythonでは、for/whileループの使用をできるだけ避け、if判断もできるだけ少なくすることで、コードが簡潔になるだけでなく、コードの実行効率も高くなります(現在は感じません).
Pythonには便利な使い方がたくさんあり、関数式のプログラミングをサポートしています.Java/C++などの比較的強いタイプの静的言語に比べて、多くのシーンで便利です(性能は糞のようなものですが(′▽`)∞).これらの便利さもPythonの膨大な生態を生み出し、pythonのような生態はまだ見られません(個人的な観点では、鉄棒を歓迎します).
ある学習者はpythonの再帰実装を質問し、具体的なテーマは再帰的に、指定したディレクトリの下のすべてのファイルのsize統計を実現することです.自分で書いたら、この問題は面白いですね.
コードは次のとおりです.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from multiprocessing.dummy import Pool as ThreadPool
import os
# python , , Linux , ʅ(´◔౪◔)ʃ
path = "/home/david/Code/Python"
def dir_size(d):
"""
.
, , , ,
, size, 。
"""
#
dlist = os.listdir(d)
#
allsize = 0
for i in dlist:
#
file = os.path.join(d, i)
#
if os.path.isfile(file):
m = os.path.getsize(file)
allsize += m
#
if os.path.isdir(file):
#
allsize += dir_size(file)
return allsize
print('dir size:\t{}'.format(dir_size(path)))
def dir_size(d):
"""
comprehension .
, comprehension 。
"""
dlist = [os.path.join(d, i) for i in os.listdir(d)]
allsize = sum([os.path.getsize(file)
for file in dlist if os.path.isfile(file)])
allsize += sum([dir_size(file)
for file in dlist if os.path.isdir(file)])
return allsize
print('dir size:\t{}'.format(dir_size(path)))
def dir_size(d):
"""
comprehension .
, , .
"""
return sum([dir_size(f) if os.path.isdir(f) else os.path.getsize(f)
for f in [os.path.join(d, i) for i in os.listdir(d)]])
print('dir size:\t{}'.format(dir_size(path)))
def dir_size(d):
"""
map filter .
, 。
"""
dlist = [os.path.join(d, i) for i in os.listdir(d)]
allsize = sum(map(os.path.getsize, filter(os.path.isfile, dlist)))
allsize += sum(map(dir_size, filter(os.path.isdir, dlist)))
return allsize
print('dir size:\t{}'.format(dir_size(path)))
def dir_size(d):
"""
.
1, , , SSD, ,
IO 。 NFS, ,
。
2, , 。python , 。
, 。
walk , ,
, 。
"""
dlist = [os.path.join(d, i) for i in os.listdir(d)]
allsize = sum([os.path.getsize(file)
for file in dlist if os.path.isfile(file)])
p = ThreadPool()
ret = p.map(dir_size, [file for file in dlist if os.path.isdir(file)])
p.close()
p.join()
allsize += sum(ret)
return allsize
print('dir size:\t{}'.format(dir_size(path)))
def dir_size(d):
"""
walk .
, , 。
walk comprehension , 。
"""
allsize = 0
for r, ds, fs in os.walk(d):
allsize += sum(os.path.getsize(file) for
file in [os.path.join(r, f) for f in fs])
return allsize
print('dir size:\t{}'.format(dir_size(path)))
まとめ
どこが見えるか忘れてしまいましたが、pythonでは、for/whileループの使用をできるだけ避け、if判断もできるだけ少なくすることで、コードが簡潔になるだけでなく、コードの実行効率も高くなります(現在は感じません).
Pythonには便利な使い方がたくさんあり、関数式のプログラミングをサポートしています.Java/C++などの比較的強いタイプの静的言語に比べて、多くのシーンで便利です(性能は糞のようなものですが(′▽`)∞).これらの便利さもPythonの膨大な生態を生み出し、pythonのような生態はまだ見られません(個人的な観点では、鉄棒を歓迎します).