我有一个程序需要将许多大型的一维numpy浮点数组变成分隔的字符串.相对于我的程序中的数学运算,我发现这个操作相当慢,我想知道是否有办法加速它.例如,考虑以下循环,它在numpy数组中占用100,000个随机数,并将每个数组连接成逗号分隔的字符串.
import numpy as np
x = np.random.randn(100000)
for i in range(100):
",".join(map(str, x))
Run Code Online (Sandbox Code Playgroud)
此循环大约需要20秒才能完成(总计,而不是每个循环).相反,考虑像元素乘法(x*x)这样的100个循环将需要超过1/10秒才能完成.显然,字符串连接操作会产生很大的性能瓶颈; 在我的实际应用程序中,它将主导整个运行时.这让我想知道,有没有比","更快的方式.join(map(str,x))?由于map()几乎是所有处理时间的发生,因此可归结为是否有更快的方式将大量数字转换为字符串.
我正在使用MySQL的MySQLdb模块(用于Windows Python 2.7的v1.2.3预编译二进制文件)来读取和写入MySQL数据库的数据.一旦连接打开,我就可以使用该连接来观察在同一连接上对数据库所做的更改,但是看不到使用其他连接进行的更改,无论另一个连接是在Python中进行还是使用了更改MySQL命令行客户端.在我使用Python进行更新的情况下,请注意我在连接上运行commit()命令.
使用一个VARCHAR列将新记录插入测试表的程序示例:
import MySQLdb
conn = MySQLdb.connect("localhost", "test", "test", "test")
c = conn.cursor()
c.execute("INSERT INTO test VALUES(%s)", ("Test",))
conn.commit()
c.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)
最终打印常量记录计数的程序示例(而不是打印最新的记录计数).我只能通过杀死和重新运行脚本或每次SELECT
运行语句时打开一个新连接来更新计数.
import MySQLdb
conn = MySQLdb.connect("localhost", "test", "test", "test")
while True:
input = raw_input("Enter anything: ")
if input == "exit":
break
c = conn.cursor()
c.execute("SELECT COUNT(*) FROM test")
res = c.fetchone()[0]
c.close()
print("Number of records: %d" % res)
Run Code Online (Sandbox Code Playgroud) 我在创建一个非常简单的Python HTTP服务器时遇到了一些性能问题.关键问题是性能取决于我用来访问它的客户端,服务器和所有客户端在本地计算机上运行的位置.例如,从Python脚本(urllib2.urlopen(' http:// localhost / ').read())发出的GET请求只需要一秒钟就可以完成,考虑到服务器处于空载状态,这似乎很慢.使用MSXML2.ServerXMLHTTP从Excel运行GET请求也感觉很慢.但是,请求数据谷歌Chrome或来自RCurl的卷曲加载项RCurl会产生基本上即时的响应,这正是我所期望的.
更让我感到困惑的是,当我在工作时使用计算机时,我没有遇到任何客户端的性能问题(性能问题出在我的家用计算机上).两个系统都运行Python 2.6,尽管工作计算机运行Windows XP而不是7.
下面是我非常简单的服务器示例,它只是为任何get请求返回'Hello world'.
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
print("Just received a GET request")
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write('Hello world')
return
def log_request(self, code=None, size=None):
print('Request')
def log_message(self, format, *args):
print('Message')
if __name__ == "__main__":
try:
server = HTTPServer(('localhost', 80), MyHandler)
print('Started http server')
server.serve_forever()
except KeyboardInterrupt:
print('^C received, shutting down server')
server.socket.close()
Run Code Online (Sandbox Code Playgroud)
请注意,在MyHandler中,我重写了log_request()和log_message()函数.原因是我读到由这些功能之一执行的完全限定的域名查找可能是服务器速度慢的原因.不幸的是,将它们设置为仅打印静态消息并不能解决我的问题.
另外,请注意我已将print()语句作为MyHandler中do_GET()例程的第一行.在打印此消息之前发生缓慢,这意味着在它之后没有任何东西导致延迟.
有没有办法向R6类添加静态方法?例如,可以调用的函数
MyClass$method()
Run Code Online (Sandbox Code Playgroud)
代替
myinstance <- MyClass$new()
myinstance$method()
Run Code Online (Sandbox Code Playgroud) 我试图理解当创建过程可以通过构造函数或通过__new__
方法时应该如何创建Python类的新实例.特别是,我注意到在使用构造函数时,该__init__
方法将在之后自动调用__new__
,而在__new__
直接调用__init__
时,不会自动调用该类.__init__
当__new__
通过嵌入对__init__
内部的调用显式调用时,我可以强制调用__new__
,但是__init__
当通过构造函数创建类时,最终会被调用两次.
例如,考虑以下玩具类,它存储一个内部属性,即一个list
名为的对象data
:将此视为向量类的开头很有用.
class MyClass(object):
def __new__(cls, *args, **kwargs):
obj = object.__new__(cls, *args, **kwargs)
obj.__init__(*args, **kwargs)
return obj
def __init__(self, data):
self.data = data
def __getitem__(self, index):
return self.__new__(type(self), self.data[index])
def __repr__(self):
return repr(self.data)
Run Code Online (Sandbox Code Playgroud)
可以使用构造函数创建类的新实例(实际上不确定这是否是Python中的正确术语),类似于
x = MyClass(range(10))
或通过切片,你可以看到调用一个调用__new__
的__getitem__
方法.
x2 = x[0:2]
在第一个实例中,__init__
将被调用两次(通过内部显式调用__new__
然后再自动调用),并在第二个实例中调用一次.显然,我只想__init__
在任何情况下调用一次.有没有一种标准的方法在Python中执行此操作?
请注意,在我的示例中,我可以摆脱该__new__
方法并重新定义__getitem__ …
当numpy的numpy.apply_along_axis()
函数优于简单的Python循环时,我很困惑.例如,考虑具有许多行的矩阵的情况,并且您希望计算每行的总和:
x = np.ones([100000, 3])
sums1 = np.array([np.sum(x[i,:]) for i in range(x.shape[0])])
sums2 = np.apply_along_axis(np.sum, 1, x)
Run Code Online (Sandbox Code Playgroud)
在这里,我甚至使用内置的numpy函数,np.sum
但计算sums1
(Python循环)需要不到400ms而calculate sums2
(apply_along_axis
)需要超过2000ms(Windows上的NumPy 1.6.1).通过进一步的比较方式,R的rowMeans函数通常可以在不到20ms的时间内完成(我很确定它正在调用C代码),而类似的R函数apply()
可以在大约600ms内完成.
我无法让VBA的Evaluate()函数只执行一次; 它似乎总是运行两次.例如,考虑下面的简单示例.如果我们运行RunEval()子例程,它将调用两次EvalTest()函数.这可以通过在即时窗口中打印的两个不同的随机数看出.如果我们使用Evaluate而不是函数调用另一个子例程,行为将是相同的.有人可以解释我如何获得Evaluate执行目标函数一次而不是两次?谢谢.
Sub RunEval()
Evaluate "EvalTest()"
End Sub
Public Function EvalTest()
Debug.Print Rnd()
End Function
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用mechanize(v0.2.5)来处理页面上具有禁用图像作为表单元素之一的表单.当我尝试选择表单时,mechanize会引发一个AttributeError: control 'test' is disabled
地方test
是禁用控件的名称.例如,
br = mechanize.Browser(factory=mechanize.RobustFactory())
br.open("http://whatever...")
br.select_form(nr=0)
Run Code Online (Sandbox Code Playgroud)
导致此堆栈跟踪:
br.select_form(nr=0)
File "build\bdist.win32\egg\mechanize\_mechanize.py", line 499, in select_form
File "build\bdist.win32\egg\mechanize\_html.py", line 544, in __getattr__
File "build\bdist.win32\egg\mechanize\_html.py", line 557, in forms
File "build\bdist.win32\egg\mechanize\_html.py", line 237, in forms
File "build\bdist.win32\egg\mechanize\_form.py", line 844, in ParseResponseEx
File "build\bdist.win32\egg\mechanize\_form.py", line 1017, in _ParseFileEx
File "build\bdist.win32\egg\mechanize\_form.py", line 2735, in new_control
File "build\bdist.win32\egg\mechanize\_form.py", line 2336, in __init__
File "build\bdist.win32\egg\mechanize\_form.py", line 1221, in __setattr__
AttributeError: control 'test' is disabled
Run Code Online (Sandbox Code Playgroud)
检查机械化源代码,当有任何表单元素评估为a mechanize.SubmitControl
且没有预定义value
属性时,看起来总是会引发此错误.例如,以下表单会引发相同的错误: …
我有两个大小相同的 numpy.array 对象(都是一维),其中一个包含起始索引位置列表,另一个包含结束索引位置列表(或者你可以说我有一个列表起始位置和窗口长度)。如果重要的话,由起始位置和结束位置形成的切片保证不重叠。我试图弄清楚如何使用这些开始和结束位置来形成另一个数组对象的索引,而不必使用循环。
例如:
import numpy as np
start = np.array([1,7,20])
end = np.array([3,10,25])
Run Code Online (Sandbox Code Playgroud)
想参考一下
somearray[1,2,7,8,9,20,21,22,23,24])
Run Code Online (Sandbox Code Playgroud)