2017-04-06 4 views
-2

数字を繰り返した数字を含まない数字を返すためのコードスニペットが書かれています。次のpythonスニペットを最適化する方法は?

例えば、入力が7の場合、プログラムは7カウントが(1,2,3,4,5,6,7)の計数値を返し、出力は7になります。

入力が23の場合、プログラムは数字の数を返します。23の数値は(1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20,21,23)です。ここでは11,22のような数値は除外され、出力は21になります。

このコードを最適化するにはどうすればよいですか?

def nonrep1(n): 
    return sum(all(c != d for c, d in zip(str(i), str(i)[1:])) for i in xrange(1, n+1)) 

私はこのコードを最適化する必要がありますが、どうすればよいですか?

テストケース1:

簡単な入力:

7 

簡単出力:

7 

テストケース2:

シンプルな入力:

3456 

簡単な出力:「神託のソリューションがいかに遅いと

2562 
+5

おそらくhttps://codereview.stackexchange.com/の候補です – languitar

+2

このフォームの質問は、コードの内容に関するすべてのコンテキストが不足しているため、コードレビューでうまく受け入れられない可能性があります。不明そこに掲載される場合は、より多くの文脈を追加することを強くお勧めします。 – Phrancis

+1

「このコードを最適化する」とはどういう意味ですか?ソースコードの長さを最適化しますか?パフォーマンス?使用されている関数の数? ... – kravemir

答えて

-1

常にびっくり。ここでcythonを使用して80高速化の要因である:

from libc.math cimport log10 
from cython.operator cimport preincrement as preinc 
import cython 

@cython.cdivision(True) 
cdef int add_number(int i): 
    cdef int cur_last = i % 10, next_last = 0 
    cdef int cur_val = i/10 

    cdef int jj = 0 
    for jj in xrange(int(log10(cur_val) + 1)): 
     next_last = cur_val % 10 
     if next_last == cur_last: 
      return 0 
     cur_val /= 10 
     cur_last = next_last 

    return 1 

cpdef int cython_nonrep1(int n): 
    cdef int s = 0 
    cdef int i = 0 
    if n < 10: 
     return n 

    for i in xrange(10, n+1): 
     s += add_number(i) 
    return s 

.pyxファイルに保存してpyximportを使用する(またはのdistutilsなどでそれを構築する)、それを使用するには

いくつかのベンチマークは:

%timeit nonrep1(3456) 
100 loops, best of 3: 4.92 ms per loop 


% timeit cython_nonrep1(3456) 
10000 loops, best of 3: 63.4 µs per loop 
+0

なぜこれがdownvoteの価値があったのかに関するコメント? – user3684792

関連する問題