小编ebl*_*ume的帖子

python中快速,大宽度,非加密的字符串散列

我需要python中的高性能字符串散列函数,它产生至少34位输出的整数(64位有意义,但32位太少).在Stack Overflow上还有其他一些问题,比如这个问题,但是我发现的每一个被接受/赞成的答案都属于几个类别中的一个,这些类别不适用(由于给定的原因).

  • 使用内置hash()功能.这个函数,至少在我正在开发的机器上(使用python 2.7和64位cpu)产生一个适合32位的整数 - 对我来说不够大.
  • 使用hashlib.hashlib提供加密哈希例程,这些例程比非加密目的慢得多.我发现这是不言而喻的,但如果你需要基准和引用来说服你这个事实,那么我可以提供.
  • 使用该string.__hash__()函数作为原型来编写自己的函数.我怀疑这将是正确的方法,除了这个特定函数的效率在于它使用了c_mul函数,它包裹了大约32位 - 再次,太小了我的使用!非常令人沮丧,它非常接近完美!

理想的解决方案具有以下属性,具有相对宽松的重要性.

  1. 输出范围至少延长34位,可能是64位,同时在所有位上保持一致的雪崩属性.(连接32位哈希值往往会违反雪崩属性,至少我的愚蠢的例子.)
  2. 便携.在两台不同的机器上给出相同的输入字符串,我应该两次得到相同的结果.这些值将存储在文件中以供以后重复使用.
  3. 高性能.越快越好,因为在我正在运行的程序执行期间,这个函数大约会被调用大约200亿次(这是目前性能关键的代码.)它不需要用C语言编写,它真的只需要优于md5(在字符串的内置hash()的某个地方).
  4. 接受'扰动'(这里使用的更好的词是什么?)整数作为输入来修改输出.我在下面举了一个例子(列表格式化规则不会让我把它放得更近.)我想这不是100%必要的,因为它可以通过手动扰动函数的输出来模拟,但是把它作为输入给了我一种温暖的感觉.
  5. 完全用Python编写.如果它是绝对的,肯定需要用C语言编写,那么我想可以做到,但是我用python编写的函数比用C语言编写的更快的函数慢了20%,这只是因为使用两种不同语言的项目协调头痛.是的,这是一个警察,但这是一个愿望清单.

'Perturbed'哈希示例,其中哈希值以小整数值n急剧变化

def perturb_hash(key,n):
    return hash((key,n))
Run Code Online (Sandbox Code Playgroud)

最后,如果你很好奇我正在做什么,我需要这样一个特定的哈希函数,我正在完全重写pybloom模块以大大提高它的性能.我成功了(它现在运行速度提高了大约4倍,占用了大约50%的空间)但是我注意到有时如果滤波器变得足够大,它会突然出现假阳性率.我意识到这是因为哈希函数没有解决足够的位数.32位只能解决40亿位(请注意,滤波器地址位而不是字节)和一些我用于基因组数据的滤波器加倍或更多(因此最少34位).

谢谢!

python string hash high-speed-computing

37
推荐指数
2
解决办法
1万
查看次数

Python反向跨越切片

我的问题的一个具体例子是,"在这个例子中我如何得到'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],但这会在进程中创建两个字符串对象.我将在数十亿次执行此操作,因此每个字符串操作都很昂贵.

我一定要错过愚蠢和容易的事情.谢谢你的帮助!

python string slice

30
推荐指数
4
解决办法
3万
查看次数

使用通用换行符将Django UploadedFile作为UTF-8处理

在我的django应用程序中,我提供了一个允许用户上传文件的表单.该文件可以采用多种格式(Excel,CSV),来自各种平台(Mac,Linux,Windows),并以各种编码(ASCII,UTF-8)编码.

出于这个问题的目的,让我们假设我有一个正在接收的视图request.FILES['file'],这是一个InMemoryUploadedFile被调用的实例file.我的问题是InMemoryUploadedFile对象(如file):

  1. 不支持UTF-8编码(我\xef\xbb\xbf在文件的开头看到一个,据我所知是一个标志,意思是'这个文件是UTF-8').
  2. 不支持通用换行符(可能是上传到此系统的大多数文件都需要).

使问题复杂化的是我希望将文件传递给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)

python django

12
推荐指数
1
解决办法
7833
查看次数

python中大文件的高效文件缓冲和扫描方法

我遇到的问题描述有点复杂,我会提供更完整的信息.对于不耐烦的人,这是我可以总结的最简单的方法:

抛出换行符时,将文本文件拆分为大小为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)

python io performance bioinformatics fasta

9
推荐指数
1
解决办法
6689
查看次数

node.js的进程内持久键值存储

我需要在我正在编写的node.js应用程序中存储一些元数据.我想使用进程内持久键值存储,而不是提出自己的文件格式并管理该文件.

我在看mongodb,但似乎mongodb必须始终在进程外运行(也就是说,你需要先启动一个mongo服务器,然后在node.js.中连接它.)我要求无论这是什么商店,它完全存在于node.js进程中 - 或者至少任何外部进程完全由库透明地管理,并在应用程序关闭连接时终止它们.

我不太关心性能,但是支持异步IO到商店以跟上Node的整个异步事情会很好.

如果商店支持索引也会很好,因为我肯定会以索引有用的方式查询数据.

我很确定'sqlite'对我有用,除了我没有真正看到它像键值存储一样方便.理想情况下,我应该能够用JSON说话,而不是SQL.但是如果没有更好的存在,sqlite将会起作用.

谢谢!

node.js

5
推荐指数
1
解决办法
6025
查看次数