空间复杂度
- sys.getsizeof
from sys import getsizeof
from numpy import array
from pandas import DataFrame
r = range(10)
sg = ''.join(str(i) for i in r)
ls = list(r)
st = set(r)
dt = {i: i for i in r}
t = tuple(r)
a = array(ls)
df = DataFrame(ls)
class C:pass
def f():pass
for i in ['r', 'sg', 'ls', 'st', 'dt', 't', 'a', 'df', 'C', 'f']:
size = getsizeof(eval(i))
print('\n%2s' % i, '\033[0;7m \033[0m' * (size // 14), size)
# print(eval(i))

集合空间占用大于字典
元组空间占用小于列表
时间复杂度
Timer
from time import time
class T:
def __init__(self):
self.t = time()
def __del__(self):
t = time() - self.t
print('\n', '\033[0;7m \033[0m' * int(t * 20), t)
for
from numpy import array
r = range(500000)
sg = ''.join(str(i) for i in r)
ls = list(r)
dt = {i: i for i in r}
st = {i for i in r}
tu = tuple(r)
a = array(r)
for j in ['r', 'sg', 'ls', 'dt', 'st', 'tu', 'a', 'a.tolist()']:
t = T()
for i in eval(j):pass
del t
| 结果 | 时间 |
|---|---|
| 生成器 | 0.09400558471679688 |
| 字符串 | 0.38802218437194824 |
| 列表 | 0.06100344657897949 |
| 字典 | 0.07000398635864258 |
| 集合 | 0.06800389289855957 |
| 元组 | 0.06100344657897949 |
| numpy.array | 0.1370079517364502 |
| numpy.array.tolist() | 0.128007173538208 |
元组≈列表>字典≈集合>生成器>>numpy.array.tolist()>numpy.array>>>字符串
in
r = range(10000)
sg = ''.join(str(i) for i in r)
ls = [str(i) for i in r]
dt = {str(i): i for i in r}
st = {str(i) for i in r}
t1 = tuple(r)
t2 = tuple(ls)
t = T()
for i in ls:
if i in sg:pass # 字符串
t = T()
for i in ls:
if i in ls:pass # 列表
t = T()
for i in ls:
if i in dt:pass # 字典
t = T()
for i in ls:
if i in st:pass # 集合
t = T()
for i in ls:
if i in t1:pass # 元组(int)
t = T()
for i in ls:
if i in t2:pass # 元组
del t
| 结果 | 时间 |
|---|---|
| 字符串 | 0.2870168685913086 |
| 列表 | 3.38619327545166 |
| 字典 | 0.005000591278076172 |
| 集合 | 0.004000186920166016 |
| 元组1 | 7.896451711654663 |
| 元组2 | 3.6772103309631348 |
集合>字典>>字符串>>列表>元组
列表、字典推导式
[]
r = range(100000)
t = T()
ls1 = [i+1 for i in r]
ls2 = [i+2 for i in r]
t = T()
ls1, ls2 = [], []
for i in r:
ls1.append(i+1)
ls2.append(i+2)
del t

列表推导式更快
{}
t = T()
dt = {i: i+1 for i in r}
t = T()
for i in r:
dt[i] = i + 1
del t
0.012964963912963867
0.010970592498779297
字典推导式反而更慢
文件
from sys import getsizeof
from time import time
import os, pickle, json
class T:
def __init__(self):
self.t = time()
def __del__(self):
t = time() - self.t
print('\n', '\033[0;7m \033[0m' * int(t * 40), t)
b = {i: i for i in range(300000)}
txt = 'a.txt'
py = 'a.py'
js = 'a.json'
pkl = 'a.pickle'
with open(txt, 'w', encoding='utf-8') as f:
f.write(repr(b))
with open(py, 'w', encoding='utf-8') as f:
f.write('b=' + repr(b))
with open(js, 'w', encoding='utf-8') as f:
json.dump(b, f)
with open(pkl, 'wb') as f:
pickle.dump(b, f)
print(getsizeof(b))
for f in [txt, py, js, pkl]:
print(os.path.getsize(f))
t = T()
with open(txt, encoding='utf-8') as f:
b = f.read()
t = T()
from a import b
t = T()
with open(js, encoding='utf-8') as f:
b = json.load(f)
t = T()
with open(pkl, 'rb') as f:
b = pickle.load(f)
del t

pickle占用空间最小,读取速度较快,力荐~~
from XX import xx 速度较慢
比较符:>!=<
几乎没什么差别
from time import time
n = 9999999
t0 = time()
[i >= 1000001 for i in range(n)]
t1 = time()
[i > 1000000 for i in range(n)]
t2 = time()
[i == 1000000 for i in range(n)]
t3 = time()
[i != 1000000 for i in range(n)]
t4 = time()
print(t1 - t0, t2 - t1, t3 - t2, t4 - t3)
0.7499642372131348 0.7569770812988281 0.7450189590454102 0.7629609107971191
本文通过实验对比了不同数据结构(如列表、字典、集合等)的空间占用及操作时间,揭示了生成器、元组、列表推导式等在效率上的差异,并测试了文件读写速度。
2482

被折叠的 条评论
为什么被折叠?



