我是个勤俭节约的新手。我用python编写了一个thrift服务器,也用python编写了客户机。在
struct RatingByReport {
1: required string ticker,
2: required i32 cnt_institution,
3: optional list<string> strong_buy,
4: optional list<string> buy,
5: optional list<string> neutral,
6: optional list<string> sell,
7: optional list<string> strong_sell,
8: optional i32 cnt_maintain,
9: optional i32 cnt_upgrade,
10: optional i32 cnt_downgrade,
11: optional i32 avg_score,
12: optional string adjustment
}
struct TableRatingByReport {
1: required list<string> head,
2: required list<RatingByReport> body,
3: optional struct.CadaTranslation translation
}
service china{
void ping(),
TableRatingByReport rating_byreport(1:string ticker) throws (1:struct.CadaInternalError error)
}
# Make socket
transport = TSocket.TSocket('localhost', 30303)
# Buffering is critical. Raw sockets are very slow
transport = TTransport.TBufferedTransport(transport)
# Wrap in a protocol
protocol = TBinaryProtocol.TBinaryProtocol(transport)
# Create a client to use the protocol encoder
client = china.Client(protocol)
# Connect!
transport.open()
client.ping()
print "ping()"
print msg
msg = client.rating_byreport('2012-01-04')
print msg
transport.close()
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 230.968 230.968 <string>:1(<module>)
1 0.000 0.000 230.968 230.968 TServer.py:74(serve)
3 0.000 0.000 225.967 75.322 TSocket.py:172(accept)
3 0.000 0.000 225.967 75.322 socket.py:194(accept)
3 225.967 75.322 225.967 75.322 {method 'accept' of '_socket.socket' objects}
5 0.003 0.001 4.993 0.999 china.py:140(process)
1 0.000 0.000 3.200 3.200 china.py:177(process_rating_byreport)
1 0.000 0.000 2.366 2.366 china.py:500(write)
1 0.003 0.003 2.366 2.366 ttypes.py:515(write)
1455 0.261 0.000 2.363 0.002 ttypes.py:364(write)
155556 0.246 0.000 1.995 0.000 TCompactProtocol.py:38(nested)
145880 0.298 0.000 1.640 0.000 TCompactProtocol.py:255(__writeString)
18 1.370 0.076 1.370 0.076 {method 'recv' of '_socket.socket' objects}
5 0.000 0.000 1.292 0.258 TCompactProtocol.py:306(readMessageBegin)
13 0.000 0.000 1.292 0.099 TCompactProtocol.py:286(__readUByte)
26 0.000 0.000 1.291 0.050 TTransport.py:54(readAll)
26 0.000 0.000 1.291 0.050 TTransport.py:154(read)
5 0.000 0.000 1.291 0.258 TSocket.py:101(read)
在我的例子中,TableRatingByReport实例得到了一个包含1400行(list\)的主体,生成二进制内容的时间超过3秒(function*process_rating_byreport*,它由thift自动生成)。我不知道为什么这么慢。在
使用json序列化相同的数据,只需不到200ms
我想知道我有没有用不正确的方法来操纵节俭?在
谢谢。在
如果速度很重要,请使用tbinaryprotocolacelerated。它用C语言实现,比TBinaryProtocol的Python实现快10倍。在
另外,在您的基准测试中,比较原始JSON解析和完全节省解析,这是不公平的比较。尝试从解析的JSON创建所有Thrift对象,看看开销是来自解析还是实例化这么多pyobject。在
不管怎样,如果您关心解析性能,并且JSON对于您的应用程序来说已经足够了(例如,您不使用二进制数据,您不需要一个好的RPC接口等等),那么您应该使用它。在
相关问题 更多 >
编程相关推荐