我正在开始一个新的应用程序,并考虑使用ORM - 特别是SQLAlchemy.
假设我的数据库中有一个列'foo',我想增加它.在直接的sqlite中,这很容易:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
Run Code Online (Sandbox Code Playgroud)
我想出了SQLAlchemy SQL-builder的等价物:
engine = sqlalchemy.create_engine('sqlite:///mydata.sqlitedb')
md = sqlalchemy.MetaData(engine)
table = sqlalchemy.Table('stuff', md, autoload=True)
upd = table.update(values={table.c.foo:table.c.foo+1})
engine.execute(upd)
Run Code Online (Sandbox Code Playgroud)
这稍微慢一点,但其中并不多.
这是我对SQLAlchemy ORM方法的最佳猜测:
# snip definition of Stuff class made using declarative_base
# snip creation of session object
for c in session.query(Stuff):
c.foo = c.foo + 1
session.flush()
session.commit()
Run Code Online (Sandbox Code Playgroud)
这是正确的,但它只需要不到其他两个方法的五十倍.我认为这是因为它必须将所有数据带入内存才能使用它.
有没有办法使用SQLAlchemy的ORM生成有效的SQL?或者使用任何其他python ORM?或者我应该回去手工编写SQL?
我有一个字符串,我试图根据空行分成块.
给定一个字符串s
,我以为我可以这样做:
re.split('(?m)^\s*$', s)
Run Code Online (Sandbox Code Playgroud)
这在某些情况下有效:
>>> s = 'foo\nbar\n \nbaz'
>>> re.split('(?m)^\s*$', s)
['foo\nbar\n', '\nbaz']
Run Code Online (Sandbox Code Playgroud)
但是如果该行完全为空则它不起作用:
>>> s = 'foo\nbar\n\nbaz'
>>> re.split('(?m)^\s*$', s)
['foo\nbar\n\nbaz']
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
[python 2.5; 没有什么区别,如果我编译'^\s*$'
使用re.MULTILINE
,使用编译表达式.]
foo.py:
i = 10
def fi():
global i
i = 99
Run Code Online (Sandbox Code Playgroud)
bar.py:
import foo
from foo import i
print i, foo.i
foo.fi()
print i, foo.i
Run Code Online (Sandbox Code Playgroud)
这是有问题的.i
变化时为什么不foo.i
改变?
如果我对你说:
"我想的是0到n之间的数字,我会告诉你你的猜测是高还是低",然后你会立即进行二分搜索.
如果我删除上限怎么办?即我正在考虑一个正整数,你需要猜测它.
一种可能的方法是让你猜测2,4,8,......,直到你猜到某些k为2**k而我说"较低".然后您可以应用二进制搜索.
有更快的方法吗?
编辑:
显然,任何解决方案都需要花费时间与目标数量的大小成比例.如果我通过Ackermann功能查询格雷厄姆的数字,我们将等待你所追求的任何策略.
我也可以提供这个算法:从1开始依次猜测每个整数.
它保证在有限的时间内完成,但它显然比我的"2力量"策略更糟糕.如果我能找到更糟糕的算法(并且知道它更糟),那么也许我可以找到更好的算法?
例如,代替2的幂,也许我可以使用10的幂.然后我找到log_10(n)
步骤的上限,而不是log_2(n)
步骤.但我必须寻找更大的空间.说k = ceil(log_10(n))
.然后我需要log_2(10**k - 10**(k-1))
我的二进制搜索的步骤,我想这是关于10+log_2(k)
.对于2的幂,我在log_2(log_2(n))
搜索阶段大致有步骤.哪个胜利?
如果我向上搜索n**n
怎么办?还是其他一些序列?奖品是否适用于能够找到增长最快的序列的人?这是答案的问题吗?
谢谢你的想法.我向你们提出道歉,我建议我从MAX_INT或2**32-1开始,因为我显然已经偏离了实用性的界限.
最终编辑:
大家好,
谢谢你的回复.我接受了Norman Ramsey(以及评论者onebyone)的回答,我理解为以下论点:对于目标数n,任何策略必须能够区分(至少)0..n之间的数字,这意味着你需要(至少)O(log(n))比较.
然而,你们的一些人也指出,问题首先没有明确定义,因为在均匀概率分布下不可能选择"随机正整数"(或者说,统一概率分布不能存在于无限集).一旦我给你一个非均匀分布,你可以把它分成两半并正常应用二进制搜索.
当我四处走动时,这是一个我经常思考的问题,所以我很高兴有两个确凿的答案.
给出这样的列表:
num = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
有10个三元素组合:
[123, 124, 125, 134, 135, 145, 234, 235, 245, 345]
Run Code Online (Sandbox Code Playgroud)
我该如何生成此列表?
我使用脚本从维基百科下载文本的唯一可靠方法是使用cURL.到目前为止,我这样做的唯一方法是打电话os.system()
.即使输出在python shell中正确显示,我似乎无法返回除退出代码(0
)以外的任何内容.或者有人可以证明如何正确使用urllib
.