在软件工程中,我们一直在创建索引(例如,在数据库中),但我也听到很多人谈论倒排索引.这两者之间有什么根本不同的东西吗?他们听起来像是一回事.
我在使用另一个功能从另一个模块替换功能时遇到了麻烦,这让我发疯了.
假设我有一个模块bar.py,如下所示:
from a_package.baz import do_something_expensive
def a_function():
print do_something_expensive()
Run Code Online (Sandbox Code Playgroud)
我有另一个模块,看起来像这样:
from bar import a_function
a_function()
from a_package.baz import do_something_expensive
do_something_expensive = lambda: 'Something really cheap.'
a_function()
import a_package.baz
a_package.baz.do_something_expensive = lambda: 'Something really cheap.'
a_function()
Run Code Online (Sandbox Code Playgroud)
我希望得到结果:
Something expensive!
Something really cheap.
Something really cheap.
Run Code Online (Sandbox Code Playgroud)
但相反,我得到了这个:
Something expensive!
Something expensive!
Something expensive!
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我的代码在很大程度上依赖于yaml来进行跨语言的序列化,并且在加速某些事情时,我注意到yaml与其他序列化方法(例如,pickle,json)相比非常慢.
所以真正让我感到震惊的是,当输出几乎相同时,json比yaml快得多.
>>> import yaml, cjson; d={'foo': {'bar': 1}}
>>> yaml.dump(d, Dumper=yaml.SafeDumper)
'foo: {bar: 1}\n'
>>> cjson.encode(d)
'{"foo": {"bar": 1}}'
>>> import yaml, cjson;
>>> timeit("yaml.dump(d, Dumper=yaml.SafeDumper)", setup="import yaml; d={'foo': {'bar': 1}}", number=10000)
44.506911039352417
>>> timeit("yaml.dump(d, Dumper=yaml.CSafeDumper)", setup="import yaml; d={'foo': {'bar': 1}}", number=10000)
16.852826118469238
>>> timeit("cjson.encode(d)", setup="import cjson; d={'foo': {'bar': 1}}", number=10000)
0.073784112930297852
Run Code Online (Sandbox Code Playgroud)
PyYaml的CSafeDumper和cjson都是用C语言编写的,所以这不是C和Python速度问题.我甚至添加了一些随机数据来查看cjson是否正在进行任何缓存,但它仍然比PyYaml快.我意识到yaml是json的超集,但是如此简单的输入,yaml序列化器怎么能慢2个数量级呢?
我希望能够获得平均值,中位数,百分位数等等.我一直在寻找并且找不到类似的东西.我意识到Ruby在科学界并没有被广泛使用,但至少存在一个Ruby中非常基本的数学库,对吗?
看起来直接从Django中的查询集运行"解释"应该很容易,但我没有看到任何明显的如何做到这一点,并且"解释"在文档中搜索是一件困难的事情.
似乎在过去20年中出现的大多数新编程语言都是用C语言编写的.这完全有道理,因为C可以看作是一种可移植的汇编语言.但我很好奇的是,这是否以任何方式限制了语言的设计.是什么促使我的问题是考虑如何在Python中直接使用C堆栈来调用函数.显然,编程语言设计师可以用他们想要的任何语言做任何他们想做的事情,但在我看来,你选择编写新语言的语言会让你处于某种心态,并给你一些难以忽视的捷径.这些语言的其他特征是否来自于用该语言编写(好的还是坏的)?
我希望能够转储一个字典,其中包含我希望在块样式中具有的长字符串以便于阅读.例如:
foo: |
this is a
block literal
bar: >
this is a
folded block
Run Code Online (Sandbox Code Playgroud)
PyYAML支持使用这种样式加载文档,但我似乎找不到以这种方式转储文档的方法.我错过了什么吗?
是否有工具将正则表达式从一种流行语言的语法转换为另一种?例如,Python风格的正则表达式到Java风格的正则表达式?
或者至少,是否有人制定了一套规则来进行这些转换?
显然,一些构造将无法转换.
我一直在玩自然语言解析树并以各种方式操纵它们.我一直在使用斯坦福大学的Tregex和Tsurgeon工具,但代码很混乱,并不适合我的Python环境(这些工具是Java,不适合调整).我想要一个工具集,当我需要更多功能时,它可以轻松进行黑客攻击.还有其他工具非常适合在树上进行模式匹配,然后操纵那些匹配的分支吗?
例如,我想将以下树作为输入:
(ROOT
(S
(NP
(NP (NNP Bank))
(PP (IN of)
(NP (NNP America))))
(VP (VBD used)
(S
(VP (TO to)
(VP (VB be)
(VP (VBN called)
(NP
(NP (NNP Bank))
(PP (IN of)
(NP (NNP Italy)))))))))))
Run Code Online (Sandbox Code Playgroud)
和(这是一个简化的例子):
例如,采取树的这一部分:
(NP
(NP (NNP Bank))
(PP (IN of)
(NP (NNP America))))
Run Code Online (Sandbox Code Playgroud)
把它变成这个:
(NP
(NP (NNP Bank) (IN of) (NP (NNP America))))
Run Code Online (Sandbox Code Playgroud)
由于我的输入树是S表达式,我考虑使用Lisp(嵌入到我的Python程序中)但是我已经写了很长时间,我在Lisp中编写了一些重要内容,我不知道从哪里开始.
什么是描述模式的好方法?什么是描述操纵的好方法?什么是思考这个问题的好方法?