Numpy 文件操作较慢Python中是否有更快的查找方法?

Numpy 文件操作较慢Python中是否有更快的查找方法?,numpy,scipy,python,python-2.7,Numpy,Scipy,Python,Python 2.7,我正在将以下表格中的值存储到一个文件中: 143 800 'Ask' 213 457 'Comment' 424 800 'Hi' 第一列在这里包含唯一的元素。 但是,当我以文件格式存储第一列时,查找第一列的值效率很低,Python中是否有更有效的方法来加快查找速度。 我知道python中的字典可以实现这一点,但我正在寻找其他方法。由于我的数据包含数万亿条记录,因此我无法将它们保存在RAM的字典中。因此,我正在寻找其他方法。 同样,在每次程序执行时,在数据库中插入行,如何克服这一点

我正在将以下表格中的值存储到一个文件中:

143   800 'Ask'
213   457 'Comment'
424   800 'Hi'
第一列在这里包含唯一的元素。 但是,当我以文件格式存储第一列时,查找第一列的值效率很低,Python中是否有更有效的方法来加快查找速度。 我知道python中的字典可以实现这一点,但我正在寻找其他方法。由于我的数据包含数万亿条记录,因此我无法将它们保存在RAM的字典中。因此,我正在寻找其他方法。 同样,在每次程序执行时,在数据库中插入行,如何克服这一点,下面给出了一个我对数据库感到困惑的示例:

 143   800 'Ask'
 213   457 'Comment'
 424   800 'Hi'
 143   800 'Ask'
 213   457 'Comment'
 424   800 'Hi'

我不明白,您希望能够更快地在文件本身中搜索,还是使用python中的文件内容?在后者中,使用具有唯一元素的字典作为键

values = {143:[800,'ask'], 213:[457,'Comment'], 424:[800:'Hi']}

如果需要在持久性存储中查找内容,请使用数据库。一个例子是,它是内置的。

您所要求的可能被称为“数据库表”和“索引”。经典的方法是有一个补充文件(索引),它将表中数据元组的键映射到文件中元组的绝对位置

下面是一个使用
sqlite3
的完整代码示例,展示了如何初始化数据库,将数据放入其中,以及如何取出一行数据

import sqlite3

conn = sqlite3.connect(':memory:')
conn.execute("""CREATE TABLE Widget (id INTEGER PRIMARY KEY,
                                     serial_number INTEGER,
                                     description TEXT);""")

my_data = [ [143, 800, 'Ask'],
            [213, 457, 'Comment'],
            [424, 800, 'Hi'] ]

for row in my_data:
    conn.execute("INSERT INTO Widget (id, serial_number, description) VALUES (?,?,?);" , row )

conn.commit() # save changes

res = conn.execute("SELECT * FROM Widget WHERE id=143")
row = res.next()
print row #prints (143, 800, u'Ask')
注意使用特殊文件名
:memory:
打开临时数据库

此外,每次执行程序时,都会插入行

如果您希望以这样的方式将存储保留在文件中,那么防止重复条目在下一次执行时出现的简单解决方案就是首先截断文件。您可以通过使用
w
标志打开它来执行此操作:

f = open('filename', 'w')
# ...
f.close()
然而,听起来好像您只是想在程序执行时存储一些数据,即您想保留数据而不使其持久化。如果是这样的话,那么我想知道为什么要将内容存储在文件中

更明显的方法,也是pythonic(尽管它对Python不是特别的),是在程序执行期间将其保存在字典中。词典是可变的,因此您可以随时更改其内容:您可以添加新条目,甚至可以在以后获得更多信息时更新条目

我从存储在字典中的过程中就知道这一点,但有时我没有值[143][1]的值,即字符串“None”存储在它的位置

那根本不是问题。您可以轻松地存储一个条目,该条目的键为
143
,值为
None
,甚至可以存储一个
None
值数组:

>>> values[143] = [ None, None ]
这样,字典仍将记住您输入的密钥,因此检查密钥是否在字典中将返回true:

>>> 143 in values
True
除了python中的字典,还有其他方法可以实现同样的功能吗?我知道字典…我只是在寻找其他方法

不,在Python中,通常只有一种方法可以做正确的事情,正如“应该有一种——最好只有一种——显而易见的方法来做。”


因此,不,没有字典可能就没有合适的使用字典的方法。但话说回来,你为什么要寻找其他的方法呢?对我来说,这听起来不太像,好像你有一个很好的理由这么做,如果你有,你必须确保你解释了为什么某些方法不适合你使用。

“文件格式”并不是对你现在所做工作的一个非常具体的描述。任何可以创建索引的数据库都将提供相对快速的查找(取决于您存储的数百万条记录)。@LarryLustig我正在搜索一种pythonic方法来实现同样的功能,尽管我知道字典…但我正在搜索其他实现同样功能的方法。谢谢你helping@Niekde Klein我在字典中存储时就知道这一点,但有时我没有值[143][1]的值,即字符串“None”存储在它的位置。在python中是否有其他方法可以实现同样的功能。也非常感谢您的回答。@aquavitae除了python中的字典之外,还有其他方法可以实现同样的功能吗?我知道字典……我只是在寻找其他方法。谢谢你replying@aquavitae:不过,dicts只允许使用唯一键,因此如果他想存储两条
None
记录,那他就倒霉了。下一个最好的使用方法是
sqlite
(滚动你自己的解决方案对我来说就像是一个车轮改造的练习。)@Li aungYip听起来钥匙不可能是
None
。如果是这样的话,当使用关系数据库作为主键时,问题也会出现。啊,对不起,没有正确读取它。尽管如此,您仍然可以使用sqlite,但可以创建一个索引而不是主键字段。Database的问题是,它会在每次程序执行时不断输入行……这是不可取的,因为我希望看到每次程序执行时的新结果如何克服这一问题。非常感谢您回答sqlite的+1问题。另外,如果您使用真实的数据库,它将自动强制执行诸如唯一键的唯一性之类的操作(这对于捕获编程错误和保持数据的一致性非常有用。)@user1172532:
sqlite3.open(“:memory:”)
打开一个新的,临时
sqlite3
数据库,仅在python解释器会话/python脚本的生命周期内存在。“数据库”并不一定意味着“持久性”(即使这样,几个“droptable”语句也会将其清除掉)。您知道Python的预编译实现吗?(
sqlite3
符合条件。)尝试从头开始做这件事听起来是一种令人兴奋的方法