NumPy优于常规Python列表有什么优势?
我有大约100个金融市场系列,我打算创建一个100x100x100 = 100万个单元的立方体阵列.我将使用每个y和z对每个x进行回归(3变量),以使用标准错误填充数组.
我听说过,对于"大型矩阵",出于性能和可伸缩性的原因,我应该使用NumPy而不是Python列表.事实是,我知道Python列表,它们似乎对我有用.
如果我搬到NumPy,会有什么好处?
如果我有1000个系列(即立方体中有10亿个浮点单元)怎么办?
字典在Python 3.6中排序(至少在CPython实现下),与之前的版本不同.这似乎是一个重大变化,但它只是文档中的一小段.它被描述为CPython实现细节而不是语言特性,但也暗示这可能成为未来的标准.
在保留元素顺序的同时,新字典实现如何比旧字典实现更好?
以下是文档中的文字:
dict()现在使用PyPy开创的"紧凑"表示.与Python 3.5相比,新dict()的内存使用量减少了20%到25%.PEP 468(在函数中保留**kwargs的顺序.)由此实现.这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖(这可能会在未来发生变化,但是在更改语言规范之前,希望在几种版本的语言中使用这个新的dict实现为所有当前和未来的Python实现强制命令保留语义;这也有助于保持与随机迭代顺序仍然有效的语言的旧版本的向后兼容性,例如Python 3.5).(由INADA Naoki在issue 27350中提供.最初由Raymond Hettinger提出的想法.)
2017年12月更新:Python 3.7 保证了dict保留插入顺序
我在下面有一个词典:
colors = {
"blue" : "5",
"red" : "6",
"yellow" : "8",
}
Run Code Online (Sandbox Code Playgroud)
如何索引字典中的第一个条目?
colors[0]将返回一个KeyError明显的原因.
我指的是模块中的OrderedDictcollections,它是一个有序字典.
如果它具有可订购的附加功能,我意识到这可能通常不是必要的,但即便如此,是否有任何缺点?它慢了吗?它缺少任何功能吗?我没有看到任何遗漏的方法.
简而言之,为什么我不应该总是使用它而不是普通的字典呢?
从熊猫文档中,我收集到了独特值的索引使得某些操作有效,并且偶尔会容忍非唯一索引.
从外部来看,看起来不是非独特的指数以任何方式被利用.例如,以下ix查询足够慢,似乎正在扫描整个数据帧
In [23]: import numpy as np
In [24]: import pandas as pd
In [25]: x = np.random.randint(0, 10**7, 10**7)
In [26]: df1 = pd.DataFrame({'x':x})
In [27]: df2 = df1.set_index('x', drop=False)
In [28]: %timeit df2.ix[0]
1 loops, best of 3: 402 ms per loop
In [29]: %timeit df1.ix[0]
10000 loops, best of 3: 123 us per loop
Run Code Online (Sandbox Code Playgroud)
(我意识到这两个ix查询不会返回相同的东西 - 它只是一个调用ix非唯一索引的示例显得慢得多)
有没有办法哄骗熊猫使用更快的查找方法,如二元搜索非唯一和/或排序索引?
我有一个df超过15000行的数据框对象,如:
anime_id name genre rating
1234 Kimi no nawa Romance, Comedy 9.31
5678 Stiens;Gate Sci-fi 8.92
Run Code Online (Sandbox Code Playgroud)
我试图找到具有特定anime_id的行.
a_id = "5678"
temp = (df.query("anime_id == "+a_id).genre)
Run Code Online (Sandbox Code Playgroud)
我只是想知道这个搜索是在恒定时间(如字典)还是线性时间(如列表)中完成的.
我有一个包含速率值的OrderedDictionary.每个条目都有一个密钥的日期(每个日期发生在每年一个季度的开始),值是一个数字.日期按顺序插入,从最旧到最新.
{
date(2017, 1, 1): 95,
date(2018, 1, 1): 100,
date(2018, 6, 1): 110,
date(2018, 9, 1): 112,
}
Run Code Online (Sandbox Code Playgroud)
我的费率字典比这大得多,但这是一般的想法.给定一个任意日期,我想在字典之前找到它的值.例如,查找日期date(2018, 8, 1)应该返回值110,因为条目date(2018, 6, 1)是在我的日期查找之前的最近的键.同样,日期date(2017, 12, 1)应该返回95,因为最近的前一个键恰好是date(2017, 1, 1).
我可以通过在字典中遍历项目来轻松完成此操作:
def find_nearest(lookup):
nearest = None
for d, value in rates.items():
if(d > lookup):
break
nearest = value
return nearest
Run Code Online (Sandbox Code Playgroud)
然而,这对我来说效率低,因为在最坏的情况下,我必须扫描整个字典(我之前提到过的字典可能很大).我将做成千上万种这样的查找,所以我希望它具有高性能.
解决性能问题的另一个选择是创建我所见过的缓存,这也是可行的,尽管我想知道内存限制(我不完全确定缓存增长的大小).
我可以在这里使用任何聪明的方法或Python核心模块吗?
我知道您可以强制dict_items转换list为允许项目索引.但我不知道为什么不允许直接进行此操作.是因为dict_items物体是发电机吗?如果是这样的话,当我看到的时候
>>> {"foo": "bar", "baz": "qux"}.items()
dict_items([('foo', 'bar'), ('baz', 'qux')])
Run Code Online (Sandbox Code Playgroud)
是repr什么时候调用Python来评估我的生成器?
python ×8
dictionary ×4
python-3.x ×3
indexing ×2
pandas ×2
arrays ×1
dataframe ×1
list ×1
numpy ×1
performance ×1
python-3.6 ×1
search ×1