我需要python中的高性能字符串散列函数,它产生至少34位输出的整数(64位有意义,但32位太少).在Stack Overflow上还有其他一些问题,比如这个问题,但是我发现的每一个被接受/赞成的答案都属于几个类别中的一个,这些类别不适用(由于给定的原因).
hash()功能.这个函数,至少在我正在开发的机器上(使用python 2.7和64位cpu)产生一个适合32位的整数 - 对我来说不够大.string.__hash__()函数作为原型来编写自己的函数.我怀疑这将是正确的方法,除了这个特定函数的效率在于它使用了c_mul函数,它包裹了大约32位 - 再次,太小了我的使用!非常令人沮丧,它非常接近完美!理想的解决方案具有以下属性,具有相对宽松的重要性.
'Perturbed'哈希示例,其中哈希值以小整数值n急剧变化
def perturb_hash(key,n):
return hash((key,n))
Run Code Online (Sandbox Code Playgroud)
最后,如果你很好奇我正在做什么,我需要这样一个特定的哈希函数,我正在完全重写pybloom模块以大大提高它的性能.我成功了(它现在运行速度提高了大约4倍,占用了大约50%的空间)但是我注意到有时如果滤波器变得足够大,它会突然出现假阳性率.我意识到这是因为哈希函数没有解决足够的位数.32位只能解决40亿位(请注意,滤波器地址位而不是字节)和一些我用于基因组数据的滤波器加倍或更多(因此最少34位).
谢谢!
我的问题的一个具体例子是,"在这个例子中我如何得到'3210'?"
>>> foo = '0123456'
>>> foo[0:4]
'0123'
>>> foo[::-1]
'6543210'
>>> foo[4:0:-1] # I was shooting for '3210' but made a fencepost error, that's fine, but...
'4321'
>>> foo[3:-1:-1] # How can I get '3210'?
''
>>> foo[3:0:-1]
'321'
Run Code Online (Sandbox Code Playgroud)
看起来很奇怪,我可以写foo [4:0:-1],foo [5:1:-1]等等,并得到我所期望的,但是没有办法写切片让我得到'3210 ".
这样做的临时方法是foo [0:4] [:: - 1],但这会在进程中创建两个字符串对象.我将在数十亿次执行此操作,因此每个字符串操作都很昂贵.
我一定要错过愚蠢和容易的事情.谢谢你的帮助!
在我的django应用程序中,我提供了一个允许用户上传文件的表单.该文件可以采用多种格式(Excel,CSV),来自各种平台(Mac,Linux,Windows),并以各种编码(ASCII,UTF-8)编码.
出于这个问题的目的,让我们假设我有一个正在接收的视图request.FILES['file'],这是一个InMemoryUploadedFile被调用的实例file.我的问题是InMemoryUploadedFile对象(如file):
\xef\xbb\xbf在文件的开头看到一个,据我所知是一个标志,意思是'这个文件是UTF-8').使问题复杂化的是我希望将文件传递给python csv模块,该模块本身不支持Unicode.我很乐意接受避免这个问题的答案 - 一旦我让django玩UTF-8,我相信我可以大胆csv地做同样的事情.(同样,请忽略支持Excel的要求 - 在解决Excel文件之前,我要等到CSV工作.)
我已经尝试使用StringIO,mmap,codec,和任何的各种各样的在访问数据的方法InMemoryUploadedFile的对象.每种方法都产生了不同的错误,到目前为止还没有一种是完美的.这显示了一些我认为最接近的代码:
import csv
import codecs
class CSVParser:
def __init__(self,file):
# 'file' is assumed to be an InMemoryUploadedFile object.
dialect = csv.Sniffer().sniff(codecs.EncodedFile(file,"utf-8").read(1024))
file.open() # seek to 0
self.reader = csv.reader(codecs.EncodedFile(file,"utf-8"),
dialect=dialect)
try:
self.field_names = self.reader.next()
except StopIteration:
# The file was empty - this is not allowed.
raise …Run Code Online (Sandbox Code Playgroud) 我遇到的问题描述有点复杂,我会提供更完整的信息.对于不耐烦的人,这是我可以总结的最简单的方法:
抛出换行符时,将文本文件拆分为大小为N(绑定N,例如36)的所有(重叠)子串的最快(最短执行时间)方式是什么.
我正在编写一个模块,用于解析基于FASTA ascii的基因组格式的文件.这些文件包含所谓的'hg18'人类参考基因组,如果您愿意,可以从UCSC基因组浏览器(go slugs!)下载.
正如您将注意到的,基因组文件由chr [1..22] .fa和chr [XY] .fa组成,以及一组未在此模块中使用的其他小文件.
已经存在几个用于解析FASTA文件的模块,例如BioPython的SeqIO.(对不起,我发布了一个链接,但我还没有这么做.)不幸的是,我能找到的每个模块都没有做我想做的具体操作.
我的模块需要将基因组数据(例如,'CAGTACGTCAGACTATACGGAGCTA'可以是一条线)分成每个重叠的N长度子串.让我举一个例子,使用一个非常小的文件(实际的染色体文件长度在355到2000万个字符之间),N = 8
>>>import cStringIO
>>>example_file = cStringIO.StringIO("""\
>header
CAGTcag
TFgcACF
""")
>>>for read in parse(example_file):
... print read
...
CAGTCAGTF
AGTCAGTFG
GTCAGTFGC
TCAGTFGCA
CAGTFGCAC
AGTFGCACF
我发现的功能从我能想到的方法中获得了绝对最佳的性能:
def parse(file):
size = 8 # of course in my code this is a function argument
file.readline() # skip past the header
buffer = ''
for line in file:
buffer += line.rstrip().upper()
while len(buffer) >= size:
yield buffer[:size]
buffer = …Run Code Online (Sandbox Code Playgroud) 我需要在我正在编写的node.js应用程序中存储一些元数据.我想使用进程内持久键值存储,而不是提出自己的文件格式并管理该文件.
我在看mongodb,但似乎mongodb必须始终在进程外运行(也就是说,你需要先启动一个mongo服务器,然后在node.js.中连接它.)我要求无论这是什么商店,它完全存在于node.js进程中 - 或者至少任何外部进程完全由库透明地管理,并在应用程序关闭连接时终止它们.
我不太关心性能,但是支持异步IO到商店以跟上Node的整个异步事情会很好.
如果商店支持索引也会很好,因为我肯定会以索引有用的方式查询数据.
我很确定'sqlite'对我有用,除了我没有真正看到它像键值存储一样方便.理想情况下,我应该能够用JSON说话,而不是SQL.但是如果没有更好的存在,sqlite将会起作用.
谢谢!