我一直对使用print语句输出到终端需要多长时间感到惊讶/沮丧.在最近的一些令人痛苦的缓慢记录之后,我决定调查它并且非常惊讶地发现几乎所有花费的时间都在等待终端处理结果.
能以某种方式加速写入stdout吗?
我写了一个脚本(print_timer.py在这个问题的底部),比较写入100k行到stdout,文件和stdout重定向到的时间/dev/null.这是时间结果:
$ python print_timer.py
this is a test
this is a test
<snipped 99997 lines>
this is a test
-----
timing summary (100k lines each)
-----
print :11.950 s
write to file (+ fsync) : 0.122 s
print with stdout = /dev/null : 0.050 s
Run Code Online (Sandbox Code Playgroud)
哇.为了确保python不在幕后做某事,比如认识到我将stdout重新分配给/ dev/null或其他东西,我在脚本之外进行了重定向...
$ python print_timer.py > /dev/null
-----
timing summary (100k lines each)
-----
print : 0.053 s
write to file (+fsync) : 0.108 s
print with …Run Code Online (Sandbox Code Playgroud) 在namedtuple保留字段名称的情况下序列化到json 的推荐方法是什么?
将a namedtuple序列化为json只会导致序列化的值和字段名称在翻译中丢失.我想在json化时保留字段,因此做了以下事情:
class foobar(namedtuple('f', 'foo, bar')):
__slots__ = ()
def __iter__(self):
yield self._asdict()
Run Code Online (Sandbox Code Playgroud)
上面按照我的预期序列化到json,并且namedtuple在我使用的其他地方行为(属性访问等),除了在迭代它时使用非元组结果(这对我的用例来说很好).
在保留字段名称的情况下转换为json的"正确方法"是什么?
我有一个记录,我希望它存在于数据库中,如果它不存在,如果它已存在(主键存在)我希望字段更新到当前状态.这通常称为upsert.
以下不完整的代码片段演示了什么可行,但它似乎过于笨重(特别是如果有更多的列).什么是更好/最好的方式?
Base = declarative_base()
class Template(Base):
__tablename__ = 'templates'
id = Column(Integer, primary_key = True)
name = Column(String(80), unique = True, index = True)
template = Column(String(80), unique = True)
description = Column(String(200))
def __init__(self, Name, Template, Desc):
self.name = Name
self.template = Template
self.description = Desc
def UpsertDefaultTemplate():
sess = Session()
desired_default = Template("default", "AABBCC", "This is the default template")
try:
q = sess.query(Template).filter_by(name = desiredDefault.name)
existing_default = q.one()
except sqlalchemy.orm.exc.NoResultFound:
#default does not exist yet, …Run Code Online (Sandbox Code Playgroud) 要从python中的套接字读取数据,请调用socket.recv,它具有以下签名:
socket.recv(bufsize[, flags])
socket.recv的python文档模糊地陈述:
注意:为了最好地匹配硬件和网络现实,bufsize的值应该是2的相对较小的幂,例如4096.
问题:" 最符合硬件和网络现实 "是什么意思?将bufsize设置为非二次幂的实际影响是什么?
我已经看到许多 其他的 建议,使这个读取2的幂.我也很清楚,当数组长度为2的幂时通常有用的原因(长度上的位移/屏蔽操作,最佳FFT数组大小等),但这些是依赖于应用程序的.我只是没有看到它的一般原因socket.recv.当然不是python文档中具体建议的要点.我也没有看到底层python代码中的任何二次幂优化,使其成为特定于python的推荐
例如......如果您有一个协议,其中传入的数据包长度是完全已知的,那么显然最好只读取"最多"您正在处理的数据包所需的内容,否则您可能会吃掉下一个数据包那会很烦人.如果我正在处理的数据包只有42个字节待处理,我只会将bufsize设置为42.
我错过了什么?当我必须选择任意缓冲区/数组大小时,我通常(总是?)使长度为2的幂,以防万一.这只是多年来养成的习惯.python文档也只是习惯的受害者吗?
这不是python独有的,但由于我特意引用了python文档,我会将其标记为.
更新:我刚刚在我的系统上检查了内核级缓冲区的大小(或者至少我认为我做了......我做了cat /proc/sys/net/core/rmem_default)并且它是124928.不是2的强大. rmem_max是131071,也显然不是两个人的力量.
在研究这个问题时,我真的看不出两项建议的力量有什么好处.我准备将其称为虚假推荐......
我还添加tcp和C标签,因为他们也与此有关.
使用数据库事务时,会导致COMMIT事务中的最终语句失败的可能条件(如果有的话)是什么,假设事务中的所有语句都已经执行而没有问题?
例如......假设您有一些两阶段或三阶段提交协议,其中您执行一堆语句,然后等待一些主进程告诉您何时可以最终提交事务:
-- <initial handshaking stuff>
START TRANSACTION;
-- <Execute a bunch of SQL statements>
-- <Inform master of readiness to commit>
-- <Time passes... background transactions happening while we wait>
-- <Receive approval to commit from master (finally!)>
COMMIT;
Run Code Online (Sandbox Code Playgroud)
如果您的代码到达最终的COMMIT语句并将其发送到您的DBMS,您是否会在该语句中收到错误(唯一性问题,数据库已满等)?什么错误?为什么?它们是如何出现的?它会根据您运行的DBMS而有所不同吗?
在像这样的典型的许多安排......
Movies Actors Movies_Actors ------ ------ ------------- movie_ID actor_ID FK_movie_ID title name FK_actor_ID
...如何将关联表('Movies_Actors')索引以获得最佳读取速度?
我通常只在关联表中使用复合主键来完成此操作,如下所示:
CREATE TABLE Movies_Actors (
FK_movie_ID INTEGER,
FK_actor_ID INTEGER,
PRIMARY KEY (FK_movie_ID, FK_actor_ID)
)
Run Code Online (Sandbox Code Playgroud)
然而,这似乎是指数搜索时才有用处都 movie_ID和actor_ID(虽然我不是一个综合指数是否也适用于各个列确定).
由于两个"什么演员在电影X"和"有演员Ÿ一直处于什么样的电影"将是此表的通用查询,似乎应该对每一列单独的索引快速找到自己的角色和电影.复合索引是否有效地做到了这一点?如果没有,那么在这张桌子上使用复合索引似乎毫无意义.如果复合索引毫无意义,那么如何处理主键呢?候选键显然是两列的组合,但是如果得到的复合索引是无意义的(它一定不是?),这似乎是浪费.
此外,这个环节增加了一些困惑,并表示,它甚至可能是真正有用的指定2个综合指数...他们为一体(FK_movie_ID, FK_actor_ID),另一个反向的(FK_actor_ID, FK_movie_ID),与选择哪种是主键(因而通常聚集并且'只是'一个独特的复合索引,基于更多的查询方向.
什么是真实的故事?复合索引是否自动有效地索引每列以便在一个或另一个上进行搜索?应的最佳(在读出速度,而不是尺寸)关联表具有在每个方向上的复合指数和每列一个?什么是幕后机制?
编辑:我发现这个相关的问题,由于某种原因,我没有在发布之前找到... 如何正确索引MySQL中的多对多连接的链接表?
我有一个案例,大多数情况下,对象之间的关系是这样的,即预先配置对关系的热切(加入)负载是有意义的.但是现在我遇到了一种我真的不希望完成负载的情况.
我应该从关系中删除已加入的加载并更改所有相关查询以在查询位置(ick)加入,还是有某种方法可以在查询设置后抑制查询中的急切加载?
下面是一个示例,其中已在User-> Address关系上设置了预先加载.程序末尾的查询是否可以配置为不急于加载?
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
import sqlalchemy.orm as orm
##Set up SQLAlchemy for declarative use with Sqlite...
engine = sa.create_engine("sqlite://", echo = True)
DeclarativeBase = declarative_base()
Session = orm.sessionmaker(bind = engine)
class User(DeclarativeBase):
__tablename__ = "users"
id = sa.Column(sa.Integer, primary_key = True, autoincrement = True)
name = sa.Column(sa.String, unique = True)
addresses = orm.relationship("Address",
lazy = "joined", #EAGER LOAD CONFIG IS HERE
)
def __init__(self, Name):
self.name = Name
class Address(DeclarativeBase):
__tablename__ = …Run Code Online (Sandbox Code Playgroud) 我有一个.xlsx文件要编辑,我发现openpyxl可以操作Excel 2007文件.我只想更改某些单元格中的值并保持其他设置不变.
但在我浏览完文档后,我找不到编辑现有文件的示例.它只演示了读取.xlsx文件并写入新文件.
我尝试以下方式编辑现有文件,但在保存之后,文件中的样式已被删除(如字体,颜色):
from openpyxl.reader.excel import load_workbook
wb=load_workbook(r'd:\foo1.xlsx')
ws=wb.get_sheet_by_name('Bar')
ws.cell('A1').value= 'new_value'
# save the workbook to a new file to finish the editing
# but the style settings has been removed (such like font, color) in the new file
wb.save(r'd:\foo2.xlsx')
Run Code Online (Sandbox Code Playgroud) 我真的很难解决我正在获得的堆栈下溢问题.我在运行时得到的回溯是:
VerifyError: Error #1024: Stack underflow occurred. at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.net::URLLoader/onComplete()
这种调试特别困难,因为当我在调试模式下运行时根本不会发生这种情况.它只在编译为发布时才会发生.
有没有人有关于如何调试Stack Underflow的任何提示?对Flash的含义有一个清晰的解释吗?
如果有帮助,当我单击其处理程序进行RPC调用的按钮时会发生此错误,该按钮使用URLLoader,AsyncToken,然后调用与AsyncToken关联的AsyncResponder实例集.由于一些服务器端日志记录以及一些日志记录入侵swf,我知道UrlLoader正在成功执行并获取一个crossdomain.xml文件,正确处理它(即:如果我破坏它,我得到一个安全性错误),并且还成功完成"加载"请求(服务器发送数据).下溢似乎发生在Event.COMPLETE侦听/处理过程中(当然,也是由追踪隐含的).
mxmlc used = from flex_sdk_4.5.0.20967
示例播放器(我尝试了几个)= 10.2.153.1
更新:我的具体问题已经解决了...但我现在离开了问题,因为我想知道如何一般地调试这样的问题,而不仅仅是得到我的具体解决方案.
在我的代码中,我有以下应用程序定义:
<s:Application height="100%" width="100%"
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
initialize="InitData();">
Run Code Online (Sandbox Code Playgroud)
请注意,代码已附加到initialize事件中.
InitData()和相关的定义是:
import classes.RpcServerProxy;
public var SP:RpcServerProxy;
public function InitData():void {
SP = new RpcServerProxy("http://192.168.1.102:1234");
}
Run Code Online (Sandbox Code Playgroud)
当我将InitData()调用切换为onCompletion事件而不是initialize(感谢J_A_X!)时,问题完全消失了.似乎发生的事情是Event.COMPLETE事件处理程序(堆栈跟踪中的onComplete)正在使用全局SP对象.关于发布(vs debug)编译的一些内容必须影响SP变量初始化的启动时间.稍后将处理程序移动到onCompletion事件解决了所有问题.
如上所述,我仍然想知道有哪些技巧/工具可用于调试这样的初始化问题.
更新2:
applicationComplete似乎是一个比creationComplete放置应用程序初始化代码更好的事件.请参阅此博客文章以获取一些解释,以及此视频(大约4:25)由Adobe Tech Evangelist提供的简单"应用程序启动"数据初始化示例.
我有一个小型客户端/服务器测试应用程序,我有一个Flex应用程序,它发出服务器应用程序的HTTP请求.服务器应用程序是在我的本地计算机上运行的脚本,侦听端口8001.客户端是我在本地运行的swf,mx.rpc.http.HTTPService用于发出页面请求.
HTTPService的设置如下:
_HttpService = new HTTPService();
_HttpService.url = "http://localhost:8001";
_HttpService.contentType = "text/xml";
Run Code Online (Sandbox Code Playgroud)
当我发出基本页面请求时,我的服务器应用程序首先收到一个"GET /crossdomain.xml HTTP/1.1"请求,因为我没有安装crossdomain.xml文件而失败.我没有到位的原因是因为这一切都发生在我的本地机器上(现在),我不应该需要一个(我不认为).
当我使用Flex 3.x时,我确实在没有crossdomain.xml的情况下使用了此代码.我以为我也使用过Flex 4.现在我正在使用Flex 4.5.这里是否存在问题,可能是由于安全策略的变化?
所有这些都发生在localhost上,为什么Flash播放器会请求crossdomain.xml文件?
如果它有帮助,我的AsyncResponder回来的具体错误是:
[FaultEvent fault=[RPC Fault faultString="Security error accessing url" faultCode="Channel.Security.Error" faultDetail="Destination: DefaultHTTP"] messageId="F43DCBFF-E99A-99CC-57D8-535C13C7CD48" type="fault" bubbles=false cancelable=true eventPhase=2]
Run Code Online (Sandbox Code Playgroud) python ×6
apache-flex ×2
flash ×2
sql ×2
sqlalchemy ×2
c ×1
debugging ×1
excel-2007 ×1
json ×1
lazy-loading ×1
linux ×1
many-to-many ×1
namedtuple ×1
openpyxl ×1
postgresql ×1
printing ×1
sockets ×1
sql-server ×1
stdout ×1
tcp ×1
transactions ×1
tty ×1
upsert ×1