小编Joh*_*uhy的帖子

使用SQLAlchemy ORM有效地更新数据库

我正在开始一个新的应用程序,并考虑使用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?

python orm sqlalchemy

107
推荐指数
4
解决办法
14万
查看次数

匹配空白行与正则表达式

我有一个字符串,我试图根据空行分成块.

给定一个字符串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,使用编译表达式.]

python regex

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

python中的导入是静态的,任何解决方案?

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改变?

python

4
推荐指数
2
解决办法
280
查看次数

猜测一个无界的整数

如果我对你说:

"我想的是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))比较.

然而,你们的一些人也指出,问题首先没有明确定义,因为在均匀概率分布下不可能选择"随机正整数"(或者说,统一概率分布不能存在于无限集).一旦我给你一个非均匀分布,你可以把它分成两半并正常应用二进制搜索.

当我四处走动时,这是一个我经常思考的问题,所以我很高兴有两个确凿的答案.

language-agnostic algorithm

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

如何计算python列表中的可能性

给出这样的列表:

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)

我该如何生成此列表?

python

3
推荐指数
2
解决办法
2582
查看次数

如何使用os.system()从stdin获取数据

我使用脚本从维基百科下载文本的唯一可靠方法是使用cURL.到目前为止,我这样做的唯一方法是打电话os.system().即使输出在python shell中正确显示,我似乎无法返回除退出代码(0)以外的任何内容.或者有人可以证明如何正确使用urllib.

python shell curl os.system urllib

0
推荐指数
1
解决办法
1599
查看次数