1

文字列を受け取り、文字列の長さがxになるように繰り返すコードがあります。

>>> import math
>>> def repeat(data, length):
        return (data * int(math.ceil(float(length) / len(data))))[:length]
>>> repeat("Hello World", 22)
'Hello WorldHello World'
>>> repeat("Hello World", 20)
'Hello WorldHello Wor'

それを最適化する方法はありますか?よく使われるので、この操作は速くする必要があります。これはリストでも機能する必要があることに注意してください。

4

4 に答える 4

3

これはわずかに速いかもしれません:

def repeat(string, length):
  L = len(string)
  return string * (length // L) + string[:length % L]

string私が「可能性がある」と言ったのは、多くが典型的なものに依存しているためlengthです。'Hello World'と を使用して61、これを (古い Mac ラップトップで) 1 マイクロ秒と 1.66 マイクロ秒に計りました。と を使用する'Hello World'*10061*123、2.08 マイクロ秒に対して 2.68 マイクロ秒になります。必要な速度、文字列の長さ、および の典型的な値はどれくらいですlength?

スタック オーバーフローが (C++ のように) コメント マークであるかのように色付けされていても、注意//は「切り捨てによる除算」です (これが Python 3 と Python 2 で確実に機能するようにするためです;-)。

于 2010-06-20T01:48:11.340 に答える
0

ここで浮動小数点を行う必要はありません。古いバージョンの Python では、単に "int(length) / len(string)" と言ってください。新しいバージョンでは、"//" 演算子を使用できます。結果が得られたら、十分な長さを確保するために 1 を追加するだけです。または、さらにいくつかの追加を犠牲にして、より正確になり、最初の文字列が長くなりすぎないようにすることができます。

...
    return (data * ((int(length) + len(data) - 1) / len(data)))[:length]
于 2010-06-20T01:44:57.727 に答える
0

代わりにint(math.ceil(float(length) / len(data)))を使用できますlength/len(data) + 1。それはまったく同じではありませんが、同様に機能するはずです。

これを高速化する前に、この関数がパフォーマンスのボトルネックであると確信していますか? 毎秒何千回呼び出すでしょうか?

関数のどのバリアントがプロファイリングするのに最も速いかを調べるにtimeitは、通常、モジュールが役立ちます。

于 2010-06-20T01:45:04.573 に答える
0

本当に最適化したい場合は、Python の拡張機能として C で関数を書き直す必要があります。

ここで情報を見つけることができます。私の英語で申し訳ありませんが、私はこれが初めてです。

于 2010-06-20T02:43:40.557 に答える