我需要一种更快的方式来存储和访问大约3GB的k:v对.其中k是string或integer并且v是一个np.array(),可以是不同的形状.有没有任何对象,比标准python dict在存储和访问这样的表时更快?例如,a pandas.DataFrame?
到目前为止,我已经了解python dict是一个相当快速的哈希表实现,有什么比我的具体案例更好的?
我理解字典是在Python 3.6+中排序的插入,作为3.6中的实现细节和3.7+中的官方.
鉴于它们是有序的,似乎很奇怪,没有方法可以通过插入顺序检索字典的第i项.该唯一的解决方案可出现有O(ñ)的复杂性,无论是:
list.__getitem__.enumerate循环中的字典项,并在达到所需索引时返回值.同样,O(n)时间复杂度.由于从list具有O(1)复杂度的项目中获取项目,是否有办法通过字典实现相同的复杂性?无论是定期dict还是collections.OrderedDict工作.
如果不可能,是否存在阻止这种方法的结构性原因,或者这只是一个尚未考虑/实施的特征?
有人知道ECMAScript5的Object.keys()在常见实现中的时间复杂度吗?它是O(n)用于n钥匙?假设哈希实现,时间是否与哈希表的大小成比例?
我正在寻找语言实现者或某些现实世界基准测试的保证.
这是我的代码:
a = {0:'000000',1:'11111',3:'333333',4:'444444'}
for i in a:
print i
Run Code Online (Sandbox Code Playgroud)
表明:
0
1
3
4
Run Code Online (Sandbox Code Playgroud)
但我想要它显示:
4
3
1
0
Run Code Online (Sandbox Code Playgroud)
那么,我该怎么办?
我有一个列表my_list(该列表包含utf8字符串):
>>> len(my_list)
8777
>>> getsizeof(my_list) # <-- note the size
77848
Run Code Online (Sandbox Code Playgroud)
出于某种原因,排序列表(my_sorted_list = sorted(my_list))使用更多内存:
>>> len(my_sorted_list)
8777
>>> getsizeof(my_sorted_list) # <-- note the size
79104
Run Code Online (Sandbox Code Playgroud)
为什么sorted返回一个列表,在内存中占用的空间比初始未排序列表多?
我有一行代码:
g = x.groupby('Color')
Run Code Online (Sandbox Code Playgroud)
颜色有红色,蓝色,绿色,黄色,紫色,橙色和黑色.我该如何退回此清单?对于类似的属性,我使用x.Attribute并且它工作正常,但x.Color的行为方式不同.
我正在玩OrderedDictPython 3.6中的类型,并且对它的行为感到惊讶.当我dict在IPython中创建这样的简单时:
d = dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
Run Code Online (Sandbox Code Playgroud)
我明白了:
{'guido': 4127, 'jack': 4098, 'sape': 4139}
Run Code Online (Sandbox Code Playgroud)
作为输出,由于某种原因,它不会在实例化时保留元素的顺序.现在,当我创建一个OrderedDict从d这样的:
od = OrderedDict(d)
Run Code Online (Sandbox Code Playgroud)
输出是:
OrderedDict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
Run Code Online (Sandbox Code Playgroud)
现在我问自己,OrderedDict-constructor 如何知道实例化时元素的顺序d?并且它总是表现相同,这样我可以依赖于元素的顺序OrderedDict吗?
我已经阅读了关于字典和OrderedDicts 的Python文档,但我没有找到我的问题的答案.
来自(sys.version)的输出:
In[22]: sys.version
Out[22]: '3.6.1 (default, Apr 4 2017, 09:40:21) \n[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.38)]'
Run Code Online (Sandbox Code Playgroud) 给定一个python字典和一个整数n,我需要访问nth键.我需要在我的项目中反复多次这样做.
我写了一个函数来做到这一点:
def ix(self,dict,n):
count=0
for i in sorted(dict.keys()):
if n==count:
return i
else:
count+=1
Run Code Online (Sandbox Code Playgroud)
但问题是如果字典很大,反复使用时间复杂性会增加.
有没有一种有效的方法来做到这一点?
我有以下函数,它将XML文件解析为字典.
不幸的是,由于Python字典没有排序,我无法按照我的意愿循环遍历节点.
如何更改此值以便输出一个有序字典,该字典反映了使用'for'循环时节点的原始顺序.
def simplexml_load_file(file):
import collections
from lxml import etree
tree = etree.parse(file)
root = tree.getroot()
def xml_to_item(el):
item = None
if el.text:
item = el.text
child_dicts = collections.defaultdict(list)
for child in el.getchildren():
child_dicts[child.tag].append(xml_to_item(child))
return dict(child_dicts) or item
def xml_to_dict(el):
return {el.tag: xml_to_item(el)}
return xml_to_dict(root)
x = simplexml_load_file('routines/test.xml')
print x
for y in x['root']:
print y
Run Code Online (Sandbox Code Playgroud)
输出:
{'root': {
'a': ['1'],
'aa': [{'b': [{'c': ['2']}, '2']}],
'aaaa': [{'bb': ['4']}],
'aaa': ['3'],
'aaaaa': ['5']
}}
a
aa
aaaa
aaa
aaaaa …Run Code Online (Sandbox Code Playgroud) 我有一个大约17,000键的字典.我想一次选择一个键 - 哪个键无关紧要,我不需要以任何特定顺序发生(随机就好了).但是,在我选择一个键之后,我会在选择另一个键之前更改字典,可能是通过添加或删除键.因此,我没有可以迭代的密钥集.
由于我不需要以任何特定顺序访问它们,我可以每次将dict键转换为列表,然后弹出第一个元素.但是,由于有17,000个键,因此在每次迭代时制作一个列表大约需要0.0005-7秒,这将花费我太多的时间来满足我的需要.有没有我可以采取的快捷方式,以便每次我想选择一个密钥时,我不必用dict键编译一个庞大的列表?
python ×9
dictionary ×6
python-3.x ×4
performance ×2
collections ×1
ecmascript-5 ×1
ipython ×1
javascript ×1
list ×1
lxml ×1
numpy ×1
pandas ×1
python-3.6 ×1
reverse ×1
sorting ×1
xml ×1