2

私はPythonでmap関数をいじっていましたが、次の動作を理解するための助けを探していました:

foo="12345"
print map(int,foo)

を与えます[1, 2, 3, 4, 5]。明らかにint(foo)吐き出す12345。では、正確には何が起こっているのでしょうか。文字列は文字ごとに反復可能であるため、上記の2行は

print [int(x) for x in foo]

同じ結果が出力されることはわかっていますが、舞台裏で何か違うことはありますか? あるものは他のものよりも効率的ですか、それとも優れていますか? もう1つは「pythonic」ですか?

どうもありがとう!

4

6 に答える 6

5

map()場合によっては、リスト内包表記を使用するよりも多少速く、場合によってはリスト内包表記より map の方が遅くなります。

組み込み関数を使用する場合:

python -mtimeit -s'xs=xrange(1000)' 'map(int,"1234567890")'
10000 loops, best of 3: 18.3 usec per loop

python -mtimeit -s'xs=xrange(1000)' '[int(x) for x in "1234567890"]'
100000 loops, best of 3: 20 usec per loop

lambdamap()遅くなります:

python -mtimeit -s'xs=xrange(1000)' '[x*10 for x in "1234567890"]'
100000 loops, best of 3: 6.11 usec per loop

python -mtimeit -s'xs=xrange(1000)' 'map(lambda x:x*10,"1234567890")'
100000 loops, best of 3: 11.2 usec per loop

しかし、Python 3xmap()ではマップ オブジェクト、つまりイテレータを返します。

于 2012-10-03T05:51:57.823 に答える
1

iterableのすべての項目に関数を適用し、結果のリストを返します。

のドキュメントからmap

int() 渡されたものを整数に変換しようValueErrorとし、次のように愚かなことをしようとするとaが発生します。

>>> int('Hello')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'Hello'

map()はリストを返します。このリストには、反復可能オブジェクトを呼び出すように要求した関数の戻り値が含まれています。関数が何も返さない場合は、次Noneのようなsのリストが表示されます。

>>> def silly(x):
...   pass
...
>>> map(silly,'Hello')
[None, None, None, None, None]

これは、次のようなことを行うための短くて効率的な方法です。

   def verbose_map(some_function,something):
       results = []
       for i in something:
          results.append(some_function(i))
       return results
于 2012-10-03T05:42:46.740 に答える
0

「より効率的」とは、ワームの缶です。このコンピューターでは、CPythonでマップを使用する方が高速ですが、 pypyのリスト内包表記は高速です。

$ python -mtimeit 'map(int,"1234567890")'
100000 loops, best of 3: 8.05 usec per loop
$ python -mtimeit '[int(x) for x in "1234567890"]'
100000 loops, best of 3: 9.33 usec per loop
$ pypy -mtimeit 'map(int,"1234567890")'
1000000 loops, best of 3: 1.18 usec per loop
$ pypy -mtimeit '[int(x) for x in "1234567890"]'
1000000 loops, best of 3: 0.938 usec per loop

Python3は、追加の呼び出しが必要な場合map()でも高速であることを示していますlist()

$ python3 -mtimeit 'list(map(int,"1234567890"))'
100000 loops, best of 3: 11.8 usec per loop
$ python3 -mtimeit  '[int(x) for x in "1234567890"]'
100000 loops, best of 3: 13.6 usec per loop
于 2012-10-03T06:20:28.533 に答える
0

mapこのように機能すると考えることができます:

def map(func, iterable):
    answer = []
    for elem in iterable:
        answer.append(func(elem))
    return answer

基本的に、のi番目の要素が反復可能オブジェクトのi番目の要素での計算の結果であるLようなリストを返します。Lfunc

したがって、とsのint文字列を使用するとint、forループの各反復で、要素は特定の文字になります。これを指定するintと、実際の。として返されintます。このような文字列を呼び出しmapた結果、リストが作成されます。このリストの要素はint、文字列内の対応する文字のed値に対応しています。

そうです、もしそうならL = "12345"、それmap(int, L)はと同義です[int(x) for x in L]

お役に立てれば

于 2012-10-03T05:41:20.720 に答える
0

はい、舞台裏には大きな違いがあります。print(map)あなたが見るならば、それはビルトインです。組み込み関数は、Pythonで記述された関数よりも、または言語の解析方法に基づくほとんどの関数よりも高速に実行されます。mapは高速iterメソッドを使用しますが、リスト内包表記は使用しません。それ以外は違いはありません。

map(int, '1'*1000000)

対。

[int(i) for i in '1'*1000000]

CPythonとUNIXタイムプログラムを使用すると、マップは約3秒で完了し、リスト内包表記は約5秒で完了します。

ああ、注意すべきことの1つは、これはマップに渡される関数がCで記述されている場合にのみ関係します。

于 2012-10-03T05:41:39.440 に答える
0
foo="12345"

In [507]: dis.dis('map(int,foo)')
          0 <109>           28769
          3 STORE_SLICE+0  
          4 LOAD_ATTR       29806 (29806)
          7 <44>           
          8 BUILD_TUPLE     28527
         11 STORE_SLICE+1  

def map(func, iterable):
    answer = []
    for elem in iterable:
        answer.append(func(elem))
    return answer

dis.dis('map(int,foo)')
          0 <109>           28769
          3 STORE_SLICE+0  
          4 LOAD_ATTR       29806 (29806)
          7 <44>           
          8 BUILD_TUPLE     28527
         11 STORE_SLICE+1  
dis.dis('[int(x) for x in foo]')
          0 DELETE_NAME     28265 (28265)
          3 LOAD_GLOBAL     30760 (30760)
          6 STORE_SLICE+1  
          7 SLICE+2        
          8 BUILD_TUPLE     29295
         11 SLICE+2        
         12 SETUP_LOOP      26912 (to 26927)
         15 JUMP_FORWARD    26144 (to 26162)
         18 JUMP_IF_FALSE   23919 (to 23940)

そしてタイミング:

In [512]: timeit map(int,foo)
100000 loops, best of 3: 6.89 us per loop

In [513]: def mymap(func, iterable):
     ...:     answer = []
     ...:     for elem in iterable:
     ...:         answer.append(func(elem))
     ...:     return answer

In [514]: timeit mymap(int,foo)
100000 loops, best of 3: 8.29 us per loop

In [515]: timeit [int(x) for x in foo]
100000 loops, best of 3: 7.5 us per loop
于 2012-10-03T05:53:03.687 に答える