擅长:python、mysql、java
<p>这是我的版本。它不使用for循环。它具有恒定的复杂性O(<em>1</em>),理论上比这里使用for循环的答案更有效。</p>
<pre class="lang-python prettyprint-override"><code>from math import log
unit_list = zip(['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], [0, 0, 1, 2, 2, 2])
def sizeof_fmt(num):
"""Human friendly file size"""
if num > 1:
exponent = min(int(log(num, 1024)), len(unit_list) - 1)
quotient = float(num) / 1024**exponent
unit, num_decimals = unit_list[exponent]
format_string = '{:.%sf} {}' % (num_decimals)
return format_string.format(quotient, unit)
if num == 0:
return '0 bytes'
if num == 1:
return '1 byte'
</code></pre>
<p>为了更清楚地说明发生了什么,我们可以省略字符串格式的代码。以下是实际完成工作的几行:</p>
<pre><code>exponent = int(log(num, 1024))
quotient = num / 1024**exponent
unit_list[exponent]
</code></pre>