Recently in Python Category


前回、速度を向上させるため、素数を記憶しようということをやりましたが、失敗しました。

今回は、「どうせ記憶するなら全数記憶してみればいいんじゃないか?」という発想のもと、処理速度改善を行ってみます。



こんにちは。

前回の続きです。

以前作ったコードを動かしてみました。


こんにちは。

私は、最近、よくProject Euler※(http://projecteuler.net/)の問題を解いています。
one-minute rule は努力目標で、問題が解けりゃいいや(=うごけばいいや)レベルでコードを書いているので、できたコードの処理速度には目も当てられない状態になっています。。

「これではいかん」と一念発起し、処理速度向上の試みをしてみましたので、紹介します。

※プログラムで解く問題集です。
HDEラボの桜井です。
だいぶ涼しくなりました。

そういえば、9/10にFacebookがPython用Webサーバーフレームワーク「Tornado」をリリースしました。
FriendFeedの基盤となっていて、スケーラブルでノンブロッキングなWebサーバーだとか。

早速ですが、インストールして試してみました。
まず、ここからソースをダウンロードします。
ちなみに、Python2.5、2.6でしか動かないようです。CentOS5.3のPython2.4では文法エラーでビルドに失敗してました。
下記のように導入します。
# tar tornado-0.1.tar.gz
# cd tornado-0.1
# python setup.py install

さっそく、チュートリアルらしきものにしたがってプログラミング。
8888/TCPで待ち受けて、「HELO」と返すだけです。
面倒なのでPythonシェルで。
$ python
Python 2.6.1 (r261:67515, Mar 26 2009, 15:57:10)
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tornado.httpserver
>>> import tornado.ioloop
>>> import tornado.web
>>>
>>> class MainHandler(tornado.web.RequestHandler):
...   def get(self):
...     self.write("HELO\n")
...
>>> application = tornado.web.Application([(r"/", MainHandler),])
>>>
>>> http_server = tornado.httpserver.HTTPServer(application)
>>> http_server.listen(8888)
>>> tornado.ioloop.IOLoop.instance().start()

別のターミナルを立ち上げてアクセス。
$ telnet localhost 8888
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.0 200 OK
Content-Length: 4
Etag: "50d7c437b1b17589574e811d5085ed34a4b22340"
Content-Type: text/html; charset=UTF-8
Server: TornadoServer/0.1

HELO
Connection closed by foreign host.


感想としては...
  • Googleのwebappやweb.pyに似ている(と書いてあるし、その通り)
  • applicationを定義してる辺りはTwistedみたい
  • RESTやるならいいんじゃない?
ってところでしょうか?

もうちょっと細かいところを見てみないとわかりませんが、ちょっと楽しみなやつです。
ちなみに、ApacheLicenseです!!
HDEラボの桜井です。
さらに小ネタっていうかメモ。

先日はPython2.4でしたが、Python2.5ではsqlite3モジュールがbuilt-inになっているので、書き直してみました。

import sqlite3
# -*- coding: utf-8 -*-

con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE TEST(num integer)")
con.execute("INSERT INTO TEST(num) VALUES(200)")
for row in con.execute("SELECT * FROM TEST"):
   print row[0]
con.close()
まあ、こんな感じです。
HDEラボの桜井です。
台風が近づいています。

今日もPythonネタで。
環境は、CentOS 5.3(Python 2.4)です。

サンプルを書いてみます。
import sqlite
# -*- coding: utf-8 -*-

# RAM上にDBを作成
con = sqlite.connect(":memory:")

# 必要なテーブルを作成
cur = con.cursor()
cur.execute("create table TEST(num integer)")

# 値の書き込み
cur.execute("insert into TEST(num) values(300)")

# 値の参照
cur.execute("select * from TEST")
for row in cur:
  print row[0]

# DBの削除
cur.close()
con.close()

比較的手軽にできるので、ちょっとしたテンポラリデータベースが必要な場合には重宝するのではないでしょうか?
HDEラボの桜井です。
梅雨の時期ですねぇ。

ちょっと目を離してたら6/27にPython3.1がリリースされていました。
http://python.org/download/releases/3.1/

主な変更点は、
* ordered dictionary型の追加
* int型の最適化
* ユニットテストにテストのスキップと新しいアサーションのメソッドが追加
* IOモジュールの高速化
* TkinterがTileをサポート(Javaのルックアンドフィールみたいなもの?)
* importlibパッケージの追加
* ネストされたwithステートメントの新しい文法

使ってみようかな?

こんにちは、しのはらです。

先日、オープンソースのサーバー仮想化管理ソフト「Karesansui」がリリースされました。

実はKaresansuiの裏では、HDEがリリースしたもうひとつのオープンソースソフトウェア 「Pysilhouette」が陰ながら動いてます。

今回は、オープンソースのバックグラウンドジョブマネージャー「Pysilhouette」をご紹介いたします。


HDEラボの桜井です。
昨日のプログラムに、ちょっとだけ機能を追加してみましょう。

追加する機能は、プロキシサーバよりさらに先にあるプロキシサーバ(上位プロキシ)を
経由してインターネットにつなげるものです。

 
# -*- coding: utf-8 -*-
from twisted.web import http, proxy
from twisted.internet import reactor, ssl
from twisted.python import log
import sys
import urlparse
 
# とりあえずログを標準出力へ
log.startLogging(sys.stdout)

# 上位プロキシ設定
proxyHost = "192.168.0.1"
proxyPort = 8080

# プロキシリクエストのクラス
class MyProxyRequest(proxy.ProxyRequest):

  # processメソッドを継承
  def process(self):
    parsed = urlparse.urlparse(self.uri)
    protocol = parsed[0]
    host = parsed[1]
    print self.method

    port = self.ports[protocol]
    if ':' in host:
      host, port = host.split(':')
      port = int(port)
    rest = urlparse.urlunparse(('', '') + parsed[2:])
    if not rest:
      rest = rest + '/'
    class_ = self.protocols[protocol]
    headers = self.getAllHeaders().copy()
    if 'host' not in headers:
      headers['host'] = host
    self.content.seek(0, 0)
    s = self.content.read()

    # 上位プロキシの設定がある場合はこちら
    if proxyHost != "" and proxyPort != 0:
      clientFactory = class_(self.method, self.uri, self.clientproto, headers, s, self)
      self.reactor.connectTCP(proxyHost, proxyPort, clientFactory)
    # プロキシが必要ない場合はこちら
    else:
      clientFactory = class_(self.method, rest, self.clientproto, headers, s, self)
      self.reactor.connectTCP(host, port, clientFactory)

# プロキシクラスを継承
class MyProxy(proxy.Proxy):
  requestFactory = MyProxyRequest

# HTTPプロキシサーバのクラス
class MyProxyFactory(http.HTTPFactory):
  protocol = MyProxy
 
# 実行
reactor.listenTCP(8080, MyProxyFactory())
reactor.run


本当はhttpsのプロキシもやりたいんだけどなぁ...。
HDEラボの桜井です。
いろいろと調査の多い昨今の仕事状況ですが、久しぶりにTwistedでも。

試験用にどうしてもHTTPプロキシサーバが必要だったので、なぜかTwistedで自作。
とりあえず機能は単純。
・HTTPプロキシしかできない(CONNECTメソッドはまだできない)
・上位プロキシに転送できない
・ログは標準出力に出す

# -*- coding: utf-8 -*-
from twisted.web import http, proxy
from twisted.internet import reactor, ssl
from twisted.python import log
import sys

# とりあえずログを標準出力へ
log.startLogging(sys.stdout)

# HTTPプロキシサーバのクラス
class MyProxyFactory(http.HTTPFactory):
  protocol = proxy.Proxy

# 実行
reactor.listenTCP(8080, MyProxyFactory())
reactor.run

WEBブラウザのプロキシ設定をして、アクセスすればログが見れます。
CONNECTメソッド対応、上位プロキシ対応ができたらまた公開します。

About this Archive

This page is a archive of recent entries in the Python category.

Postfix is the previous category.

Red Hat is the next category.

Find recent content on the main index or look in the archives to find all content.