所以我对更有经验的python程序员对以下样式问题的看法感到好奇.假设我正在构建一个函数,该函数将通过pandas数据框或任何类似的用例逐行迭代,其中函数需要访问其先前的状态.似乎至少有四种方法可以在python中实现它:
1)关闭:
def outer():
previous_state = None
def inner(current_state) :
nonlocal previous_state
#do something
previous_state=current_state
return something
Run Code Online (Sandbox Code Playgroud)
因此,如果你来自javascript背景,这对你来说无疑是显而易见的.在python中感觉很自然,直到你需要访问封闭的范围,当你最终会做类似的事情inner.__code__.co_freevars,它会给你封闭变量的名称作为元组,并找到你的索引想要,然后去inner.__closure__[index].cell_contents获得它的价值.不完全优雅,但我认为重点往往是隐藏范围,所以它应该很难达到.另一方面,与OOP语言相比,当几乎所有其他方式都拥有私有变量时,python使封闭函数变为私有也感觉有点奇怪.
2)Functor
def outer():
def inner(current_state):
#do something
inner.previous_state=current_state
return something
ret = inner
ret.previous_state=None
return ret
Run Code Online (Sandbox Code Playgroud)
这"打开了封闭",现在封闭状态作为函数的属性完全可见.这是有效的,因为函数实际上只是伪装的对象.我倾向于这是最pythonic.它清晰,简洁,易读.
3)对象这可能是OOP程序员最熟悉的
class Calculator(Object) :
def __init__(self):
self.previous_state=None
def do_something(self, current_state) :
#do_something
self.previous_state = current_state
return something
Run Code Online (Sandbox Code Playgroud)
这里最大的问题是你最终会得到很多类定义.这对于像Java这样的完全OOP语言来说很好,你可以使用接口等来管理它,但是在一个简化的语言中,有许多简单的类只是为了携带需要一些状态的函数,这似乎有点奇怪.
4)全局 - 我不会证明这一点,因为我特别想避免污染全局名称空间
5)装饰器 - 这是一个有点曲线球,但你可以使用装饰器来存储部分状态信息.
@outer
def inner(previous_state, current_state):
#do something
return something
def outer(inner) :
def wrapper(current_state) :
result = inner(wrapper.previous_state, …Run Code Online (Sandbox Code Playgroud) 所以我有一个生产者和消费者的系统通过无限大小的队列连接,但如果消费者反复调用get直到抛出Empty异常,它就不会清除队列.
我相信这是因为一旦套接字缓冲区已满,消费者端队列中将对象序列化到套接字中的线程就会被阻塞,因此它会一直等到缓冲区有空间,但是,对于消费者来说这是可能的调用get"太快",所以它认为队列是空的,实际上另一侧的线程有更多的数据要发送,但是不能足够快地序列化它以防止套接字对消费者显得空洞.
我相信如果我可以更改底层套接字上的缓冲区大小(我是基于Windows的),这个问题会得到缓解.据我所知,我需要做的是:
import multiprocessing.connections as conns
conns.BUFSIZE = 2 ** 16 # is typically set as 2 ** 13 for windows
import multiprocessing.Queue as q
Run Code Online (Sandbox Code Playgroud)
如果我执行上述操作,是否意味着当多重处理初始化队列时,它将使用我已在我已导入的multiprocessing.connections版本中设置的新缓冲区大小?那是对的吗?
另外我相信这只会影响windows,因为BUFSIZE不会在linux机器上使用,因为它们的所有套接字默认设置为60千字节?
有人曾尝试过这个吗?这会对窗户产生副作用吗?Windows上的套接字缓冲区大小有哪些基本限制?
===================一个代码示例来演示===================
# import multiprocessing.connection as conn
# conn.BUFSIZE = 2 ** 19
import sys
import multiprocessing as mp
from Queue import Empty
from time import sleep
total_length = 10**8
def supplier(q):
print "Starting feeder"
for i in range(total_length) :
q.put(i)
if __name__=="__main__":
queue = mp.Queue()
p = mp.Process(target=supplier, args=(queue,))
p.start()
sleep(120) …Run Code Online (Sandbox Code Playgroud) 我想拉出当前队列中的所有项目.还有另一个线程不断地将项目放在另一端,每个时期我想要获取当前队列中的所有项目.
有什么理由可以选择:
res = []
while q.qsize > 0 :
res.append(q.get())
Run Code Online (Sandbox Code Playgroud)
要么
res = []
while True :
try :
res.append(q.get(block=False))
except Queue.Empty :
break
Run Code Online (Sandbox Code Playgroud)
现在文档明确指出qsize()> 0不会阻止队列在get上阻塞,但只有在多个线程可以从输出获取的情况下才是这样吗?
队列.qsize()返回队列的大致大小.注意,qsize()> 0不保证后续的get()不会阻塞,qsize()<maxsize也不保证put()不会阻塞.
这是否意味着第二种形式应该始终是首选?EAFP和所有这些?另外,调用q.qsize()有任何成本吗?是否会阻塞队列的另一端以便计算?
我想我已经谈过使用第二种形式,但对我来说似乎不那么干净.
python queue multiprocessing multiprocess python-multiprocessing
所以我一直在使用Neo4j API进行相当广泛的工作,我注意到它们几乎总是会有返回的功能
Iterable<Class>
Run Code Online (Sandbox Code Playgroud)
虽然我一直都明白,除非有令人信服的理由不这样做,否则最好退回Set,List或Collection中的一个.设置为向用户指示它永远不会有重复的元素,当订单重要时列出或包含重复项,或者当您没有策略时收集.
我更喜欢这些Iterable,因为它们有有用的实用程序,如.contains(),.add()等.我发现我经常需要编写代码来将Iterable转换为Collection.
所以我的问题是:我错过了一些重要的东西吗?是否有合理的理由使用Iterable而不是Collection?你什么时候这样做?显然,Neo4j的人似乎是一流的程序员,所以我认为他们有这个原因,但我看不到它.
我有一个带有多个索引的pandas数据框,默认情况下,在打印到屏幕时,它将“稀疏”输出,以便不再重复较高级别的索引。例如:
疏:
但是,df.to_excel(writer)不支持此选项,因为它将始终将索引写入为具有合并单元格的稀疏目录。有什么方法可以使这种编写以“不稀疏”的方式表现出色?另外,我可以写一个csv并将其导入excel,因为csv总是“不稀疏”,但这有点烦人。
我使用嵌入式图形数据库作为Java应用程序的一部分.假设我执行某种类型的密码查询,并返回包含节点集合的ExecutionResult.
可以假设这些节点形成连接图.
这些节点中的每一个都有一些关系,我可以使用node.getRelationships(Direction.OUTGOING)来访问这些关系.我的问题是,如果其中一个关系的目标已经出现在执行结果中(即关系是查询模板的一部分),它是否保证Relationship.getEndPoint == Node X.
我想我真正要问的是,当Neo4j中的事务返回一个节点时,它只返回一个对象,并且不同的查询将继续返回对该一个对象的引用,或者它是否继续生成碰巧的新对象请参考相同的数据点?由于Node没有覆盖equalsTo方法,我一直在假设前者,但我希望有人可以告诉我.
它在Comparator接口的合同中说,它必须与equals一致.
如果equalsTo = true,这是否意味着Comparator = 0,或者当且仅当 equalsTo = true时,它是否意味着Comparator = 0 ?
我似乎记得它是第二个,但是我遇到了许多按非唯一子属性排序的比较器.
例如,我可能有对象具有子属性日期,我想按提交日期对对象列表进行排序.但是,您可以使用相同日期的多个对象?这有什么后果?当然这个问题已经有了最佳实践解决方案吗?如何在没有违反比较合同的情况下对属性进行排序,并且不保证是唯一的?这种违规行为会带来什么后果?他们可以管理吗?
我一直在尝试使用maven设置ear的远程部署,但是失败了,因为jboss-cli.bat脚本无法连接到服务器。它因堆栈跟踪而失败:
C:\Users\pstephens\Programming\jboss-eap-6.2\jboss-eap-6.2\bin>jboss-cli.bat --controller=172.22.2.29:9999 --connect --user=pstephens --password=#######
org.jboss.as.cli.CliInitializationException: Failed to connect to the controller
at org.jboss.as.cli.impl.CliLauncher.initCommandContext(CliLauncher.java:284)
at org.jboss.as.cli.impl.CliLauncher.main(CliLauncher.java:262)
at org.jboss.as.cli.CommandLineMain.main(CommandLineMain.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.jboss.modules.Module.run(Module.java:292)
at org.jboss.modules.Main.main(Main.java:455)
Caused by: org.jboss.as.cli.CommandLineException: The controller is not available at 172.22.2.29:9990
at org.jboss.as.cli.impl.CommandContextImpl.tryConnection(CommandContextImpl.java:969)
at org.jboss.as.cli.impl.CommandContextImpl.connectController(CommandContextImpl.java:808)
at org.jboss.as.cli.impl.CommandContextImpl.connectController(CommandContextImpl.java:784)
at org.jboss.as.cli.impl.CliLauncher.initCommandContext(CliLauncher.java:282)
... 8 more
Caused by: java.io.IOException: java.net.ConnectException: JBAS012144: Could not connect to remote://172.22.2.29:9990. The connection timed out
at org.jboss.as.controller.client.impl.AbstractModelControllerClient.executeForResult(AbstractModelControllerClient.java:129)
at org.jboss.as.controller.client.impl.AbstractModelControllerClient.execute(AbstractModelControllerClient.java:71)
at org.jboss.as.cli.impl.CommandContextImpl.tryConnection(CommandContextImpl.java:947)
... 11 more
Caused by: java.net.ConnectException: JBAS012144: …Run Code Online (Sandbox Code Playgroud) python ×4
java ×3
neo4j ×2
collections ×1
comparator ×1
excel ×1
jboss ×1
jboss6.x ×1
multiprocess ×1
node-neo4j ×1
pandas ×1
python-2.7 ×1
queue ×1