Python []和{}vs list()和dict(),哪个更好?

Python []和{}vs list()和dict(),哪个更好?,python,performance,list,dictionary,Python,Performance,List,Dictionary,我知道它们本质上是一样的,但就风格而言,创建空列表或dict时使用哪一个更好(更具python风格)?大多数时候,这主要是一个选择问题。这是偏好的问题 但是请注意,如果您有数字键,例如,您不能执行以下操作: mydict = dict(1="foo", 2="bar") 你必须做到: mydict = {"1":"foo", "2":"bar"} 在我看来,[]和{}是创建空列表/目录的最具吸引力和可读性的方法 但是要小心set(),例如: this_set = {5} some_other

我知道它们本质上是一样的,但就风格而言,创建空列表或dict时使用哪一个更好(更具python风格)?

大多数时候,这主要是一个选择问题。这是偏好的问题

但是请注意,如果您有数字键,例如,您不能执行以下操作:

mydict = dict(1="foo", 2="bar")
你必须做到:

mydict = {"1":"foo", "2":"bar"}

在我看来,
[]
{}
是创建空列表/目录的最具吸引力和可读性的方法

但是要小心
set()
,例如:

this_set = {5}
some_other_set = {}

这可能令人困惑。第一个创建一个包含一个元素的集合,第二个创建一个空目录,而不是一个集合。

就速度而言,空列表/目录没有竞争:

>>> from timeit import timeit
>>> timeit("[]")
0.040084982867934334
>>> timeit("list()")
0.17704233359267718
>>> timeit("{}")
0.033620194745424214
>>> timeit("dict()")
0.1821558326547077
对于非空:

>>> timeit("[1,2,3]")
0.24316302770330367
>>> timeit("list((1,2,3))")
0.44744206316727286
>>> timeit("list(foo)", setup="foo=(1,2,3)")
0.446036018543964
>>> timeit("{'a':1, 'b':2, 'c':3}")
0.20868602015059423
>>> timeit("dict(a=1, b=2, c=3)")
0.47635635255323905
>>> timeit("dict(bar)", setup="bar=[('a', 1), ('b', 2), ('c', 3)]")
0.9028228448029267

此外,使用括号表示法可以使用列表和字典理解,这可能是很合理的。

IMHO,使用
list()
dict()
使Python看起来像C.Ugh。

dict文本可能会快一点,因为它的字节码较短:

In [1]: import dis
In [2]: a = lambda: {}
In [3]: b = lambda: dict()

In [4]: dis.dis(a)
  1           0 BUILD_MAP                0
              3 RETURN_VALUE

In [5]: dis.dis(b)
  1           0 LOAD_GLOBAL              0 (dict)
              3 CALL_FUNCTION            0
              6 RETURN_VALUE

这同样适用于
列表
[]

在[]与list()之间存在差异的情况下,有一个我没有看到其他人指出的陷阱。 如果将词典用作列表的成员,则这两种词典将给出完全不同的结果:

In [1]: foo_dict = {"1":"foo", "2":"bar"}

In [2]: [foo_dict]
Out [2]: [{'1': 'foo', '2': 'bar'}]

In [3]: list(foo_dict)
Out [3]: ['1', '2'] 

[]和list()之间的行为有一个区别,如下例所示。如果要返回数字列表,需要使用list(),否则会得到一个map对象!不知道怎么解释

sth = [(1,2), (3,4),(5,6)]
sth2 = map(lambda x: x[1], sth) 
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>

sth2 = [map(lambda x: x[1], sth)]
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>
type(sth2) # list 
type(sth2[0]) # map

sth2 = list(map(lambda x: x[1], sth))
print(sth2) #[2, 4, 6]
type(sth2) # list
type(sth2[0]) # int
sth=[(1,2)、(3,4)、(5,6)]
sth2=映射(λx:x[1],sth)
打印(sth2)#打印返回对象
sth2=[映射(lambda x:x[1],sth)]
打印(sth2)#打印返回对象
类型(sth2)#列表
类型(sth2[0])#映射
sth2=列表(映射(lambda x:x[1],sth))
打印(sth2)#[2,4,6]
类型(sth2)#列表
类型(sth2[0])#int
小心列表()和[]的工作方式不同:

>>> def a(p):
...     print(id(p))
... 
>>> for r in range(3):
...     a([])
... 
139969725291904
139969725291904
139969725291904
>>> for r in range(3):
...     a(list())
... 
139969725367296
139969725367552
139969725367616

list()总是在堆中创建新对象,但[]可以在许多方面重用内存单元。

方括号对表示列表对象或索引下标my_list[x]中的一个

花括号对表示字典对象

a_list=['on','off',1,2]


a_dict={on:1,off:2}

list()和[]之间没有这样的区别,但是如果您将其与迭代器一起使用,它会为我们提供:

nums=[1,2,3,4,5,6,7,8]

In:打印([iter(nums)])

输出:[]

In:打印(列表(iter(nums)))


Out:[1、2、3、4、5、6、7、8]

这是错误的。。。你需要做
mydict={1:“foo”,2:“bar”}
(键没有引号)。这不仅仅是“错”。键是字符串/整数,这取决于您是否引用它们。
{}
总是创建一个空的dict。
{1,2,3}
在2.7+中创建一个集合,但在
2.6
和旧版本中是语法错误。抱歉?这是一个名为
some\u epic\u set
的变量,它指向一个空的
dict
对象。。。这不是一套空的。对于一个空集合,您需要使用
set()
@6502:的确,但是
{5}
创建一个包含一个元素的集合是一个常见的陷阱,
5
{}
是一个空的指令。哇,这让人困惑。不过,这并不是令人困惑的糟糕设计水平的分形。:-)@EnderLook:实际上,使用,您可以使用
{*()}
使用文本语法创建一个空的
集。我称之为独眼猴子操作员。:-)这假设BUILD_MAP和LOAD_GLOBAL是固定时间,所用时间相同。不太可能。时间它给出了更好的估计。更有可能的是,
调用函数
所花费的时间至少与
构建映射
(被调用的函数本质上是
构建映射
),而
加载全局
所花费的时间只是额外的开销。口述和列表理解也可以使用英文名称来完成。示例:
list(如果i为%2,则范围(10)内的i为i)
是否有原因使{}和[]速度更快?我以为它们只是化名。时间似乎没有给出准确的时间。根据基准测试,它似乎需要大约200毫秒,这比正常的http调用慢得多。尝试在shell中正常运行dict(),然后运行timeit(“dict()”),您将看到执行过程中的明显差异。@Piyus实际上,
timeit()
函数报告执行指定次数迭代的总时间,默认情况下为
1000000
。上面的例子是运行代码片段一百万次的秒数。例如,
timeit('dict()',number=1)/->4.0531158447265625e-06
(一次迭代),而
timeit('dict()')/->0.12412905693054199
(一百万次迭代)@GregHaskins,所以在这种情况下,我不认为人们应该担心使用dict()或{},除非循环通过一百万条记录&使用dict()在循环中。使用
list((foo\u dict,)
可以获得与
[foo\u dict]
相同的结果。
list()
方法将iterable作为唯一的参数,并对其进行迭代以将元素添加到列表中。这将导致类似的陷阱,因为执行
list(some_list)
会使列表变平。下面似乎是使用range()函数>>>print(range(10))#range(0,10)range()的示例来解释该行为,它的行为类似于列表,但它不是列表。它是一个对象,当您对它进行迭代时,它会返回序列中的连续项,但实际上它不会生成列表,从而节省空间。这样的对象是可移植的,也就是说,适合作为函数和结构的目标,这些函数和结构期望从中获得连续的项目,直到供应耗尽为止。函数list()从iterables创建列表:>>>list(范围(5))#[0,1,2,3,4]结果是[]存储iterable对象;list()从同一个iterable创建列表