"Map" funksiyasidan foydalanishga tezroq alternativ

Exapmle uchun f funktsiyasi mavjud:

def f(x):
    return x**2

va intervalda baholangan f dan iborat qatorni olishni xohlaysiz, masalan, birlik oralig'i (0,1). Buni quyidagicha bajaramiz:

import numpy as np
X = np.arange(0,1,0.01)
arr = np.array(list(map(f, X)))

Biroq, bu oxirgi satr funktsiya murakkab bo'lganida (mening ba'zi bir integrallerle bog'liq) juda ko'p vaqt oladi. Buni tezroq qilishning usullari bormi? Men chiroyli yechimga ega bo'lganimdan xursandman - diqqat tezlikga qaratilgan.

0
Agar X uzunligi katta bo'lmasa map() yuki haqida tashvishlanmasdim. f() ni optimallashtirishni vaqt sarflang.
qo'shib qo'ydi muallif zwer, manba
Agar X uzunligi katta bo'lmasa map() yuki haqida tashvishlanmasdim. f() ni optimallashtirishni vaqt sarflang.
qo'shib qo'ydi muallif zwer, manba
Bu sizning savolingizga javob emas, lekin faqat qatorni yaratish uchun ro'yxat tuzish juda samarasizdir. fromiter() dan foydalanishingiz mumkin buni amalga oshirishdan qochish uchun. Siz uzunligini bilishingiz kerak, ammo uning xarita operatsiyalari hisobga olinsa, bu siz ko'rsatayotgan qator kabi bir xil bo'ladi. Agar siz Numpy bilan tezlikni xohlasangiz, siz numpy operatsiyalaridan foydalanmoqchisiz - xaritalar python-yonli loops va operatsiyalarni asta-sekin tushishini anglatadi.
qo'shib qo'ydi muallif Gareth Latty, manba
Bu sizning savolingizga javob emas, lekin faqat qatorni yaratish uchun ro'yxat tuzish juda samarasizdir. fromiter() dan foydalanishingiz mumkin buni amalga oshirishdan qochish uchun. Siz uzunligini bilishingiz kerak, ammo uning xarita operatsiyalari hisobga olinsa, bu siz ko'rsatayotgan qator kabi bir xil bo'ladi. Agar siz Numpy bilan tezlikni xohlasangiz, siz numpy operatsiyalaridan foydalanmoqchisiz - xaritalar python-yonli loops va operatsiyalarni asta-sekin tushishini anglatadi.
qo'shib qo'ydi muallif Gareth Latty, manba
Bu sizning savolingizga javob emas, lekin faqat qatorni yaratish uchun ro'yxat tuzish juda samarasizdir. fromiter() dan foydalanishingiz mumkin buni amalga oshirishdan qochish uchun. Siz uzunligini bilishingiz kerak, ammo uning xarita operatsiyalari hisobga olinsa, bu siz ko'rsatayotgan qator kabi bir xil bo'ladi. Agar siz Numpy bilan tezlikni xohlasangiz, siz numpy operatsiyalaridan foydalanmoqchisiz - xaritalar python-yonli loops va operatsiyalarni asta-sekin tushishini anglatadi.
qo'shib qo'ydi muallif Gareth Latty, manba
@ juanpa.arrivillaga Hujjatlar quyidagicha: 'Ish faoliyatini yaxshilash uchun hisob-kitoblarni ko'rsating . Bu noan'anaviy mahsulotni chiqish majmuasini oldindan taqsimlashga imkon beradi, buning uchun uni qayta o'lchamaslik kerak. '' - bu holda u eng maqbul ishni bajaradi - hech bo'lmaganda ro'yxatni yoki bir nechta o'lchamlarni o'zgartirish bilan solishtirganda.
qo'shib qo'ydi muallif Gareth Latty, manba
@ juanpa.arrivillaga Hujjatlar quyidagicha: 'Ish faoliyatini yaxshilash uchun hisob-kitoblarni ko'rsating . Bu noan'anaviy mahsulotni chiqish majmuasini oldindan taqsimlashga imkon beradi, buning uchun uni qayta o'lchamaslik kerak. '' - bu holda u eng maqbul ishni bajaradi - hech bo'lmaganda ro'yxatni yoki bir nechta o'lchamlarni o'zgartirish bilan solishtirganda.
qo'shib qo'ydi muallif Gareth Latty, manba
@zwer qabul qilindi. Siz ro'yxatni tushunish orqali bir oz tezlashtirasiz, ammo bu umumiy ish vaqti sezilarli darajada o'zgarmaydi. bu savolni
qo'shib qo'ydi muallif juanpa.arrivillaga, manba
@zwer qabul qilindi. Siz ro'yxatni tushunish orqali bir oz tezlashtirasiz, ammo bu umumiy ish vaqti sezilarli darajada o'zgarmaydi. bu savolni
qo'shib qo'ydi muallif juanpa.arrivillaga, manba
@GarethLatty Aslida, kodni np.empty qatoriga kiritadigan va indeksga ko'ra to'g'ri qiymatlarni belgilaydigan for-loopga kodni qayta kiritib, foriter , lekin ishonch hosil qiling. foriter odatda sekin, numpy qatorlari deyarli S massivlari bo'lib, ularni takomillashtirish samarali emas. Qopqoq ostida initer ishlatilsa, uni iteratorni ro'yxatning biron bir joyiga sarf qilsam, ajablanmasdim ...
qo'shib qo'ydi muallif juanpa.arrivillaga, manba
@GarethLatty Aslida, kodni np.empty qatoriga kiritadigan va indeksga ko'ra to'g'ri qiymatlarni belgilaydigan for-loopga kodni qayta kiritib, foriter , lekin ishonch hosil qiling. foriter odatda sekin, numpy qatorlari deyarli S massivlari bo'lib, ularni takomillashtirish samarali emas. Qopqoq ostida initer ishlatilsa, uni iteratorni ro'yxatning biron bir joyiga sarf qilsam, ajablanmasdim ...
qo'shib qo'ydi muallif juanpa.arrivillaga, manba
@GarethLatty yaxshi ovchi.
qo'shib qo'ydi muallif juanpa.arrivillaga, manba

12 javoblar

Ishlash vaqtini biroz pasaytirish uchun ro'yxatni tushunishingiz mumkin.

arr = [f(x) for x in range(0, 5)] # range is the interval

Bu ishlashi kerak. Bu faqat ish vaqti qisqartiradi. map() bilan juda katta sonlarni ishlatmaguningizcha ish vaqti haqida qayg'urmasligingiz kerak.

2
qo'shib qo'ydi

Ishlash vaqtini biroz pasaytirish uchun ro'yxatni tushunishingiz mumkin.

arr = [f(x) for x in range(0, 5)] # range is the interval

Bu ishlashi kerak. Bu faqat ish vaqti qisqartiradi. map() bilan juda katta sonlarni ishlatmaguningizcha ish vaqti haqida qayg'urmasligingiz kerak.

2
qo'shib qo'ydi

Ishlash vaqtini biroz pasaytirish uchun ro'yxatni tushunishingiz mumkin.

arr = [f(x) for x in range(0, 5)] # range is the interval

Bu ishlashi kerak. Bu faqat ish vaqti qisqartiradi. map() bilan juda katta sonlarni ishlatmaguningizcha ish vaqti haqida qayg'urmasligingiz kerak.

2
qo'shib qo'ydi

Agar f kompilyatsiya qilingan majmuaviy operatsiyalar bo'yicha ifodalanishi mumkin bo'lmasa va faqat skalarlarni qabul qila olmasa, frompyfunc 2x aniq aylanaga nisbatan)

In [76]: def f(x):
    ...:     return x**2
    ...: 

In [77]: foo = np.frompyfunc(f,1,1)

In [78]: foo(np.arange(4))
Out[78]: array([0, 1, 4, 9], dtype=object)

In [79]: foo(np.arange(4)).astype(int)
Out[79]: array([0, 1, 4, 9])

Dtype obyektini qaytaradi, shuning uchun astype kerak. np.vectorize bu ham foydalanadi, lekin bir oz sekin. Har ikkisi ham turli xil shakllar (lar) ga umumlashtiriladi.

1-natija uchun titer kodi map bilan ishlaydi ( ro'yxat holda):

In [84]: np.fromiter((f(x) for x in range(4)),int)
Out[84]: array([0, 1, 4, 9])

In [86]: np.fromiter(map(f, range(4)),int)
Out[86]: array([0, 1, 4, 9])

Haqiqiy holatda o'z vaqtini qilish kerak.

1
qo'shib qo'ydi

Agar f kompilyatsiya qilingan majmuaviy operatsiyalar bo'yicha ifodalanishi mumkin bo'lmasa va faqat skalarlarni qabul qila olmasa, frompyfunc 2x aniq aylanaga nisbatan)

In [76]: def f(x):
    ...:     return x**2
    ...: 

In [77]: foo = np.frompyfunc(f,1,1)

In [78]: foo(np.arange(4))
Out[78]: array([0, 1, 4, 9], dtype=object)

In [79]: foo(np.arange(4)).astype(int)
Out[79]: array([0, 1, 4, 9])

Dtype obyektini qaytaradi, shuning uchun astype kerak. np.vectorize bu ham foydalanadi, lekin bir oz sekin. Har ikkisi ham turli xil shakllar (lar) ga umumlashtiriladi.

1-natija uchun titer kodi map bilan ishlaydi ( ro'yxat holda):

In [84]: np.fromiter((f(x) for x in range(4)),int)
Out[84]: array([0, 1, 4, 9])

In [86]: np.fromiter(map(f, range(4)),int)
Out[86]: array([0, 1, 4, 9])

Haqiqiy holatda o'z vaqtini qilish kerak.

1
qo'shib qo'ydi

Agar f kompilyatsiya qilingan majmuaviy operatsiyalar bo'yicha ifodalanishi mumkin bo'lmasa va faqat skalarlarni qabul qila olmasa, frompyfunc 2x aniq aylanaga nisbatan)

In [76]: def f(x):
    ...:     return x**2
    ...: 

In [77]: foo = np.frompyfunc(f,1,1)

In [78]: foo(np.arange(4))
Out[78]: array([0, 1, 4, 9], dtype=object)

In [79]: foo(np.arange(4)).astype(int)
Out[79]: array([0, 1, 4, 9])

Dtype obyektini qaytaradi, shuning uchun astype kerak. np.vectorize bu ham foydalanadi, lekin bir oz sekin. Har ikkisi ham turli xil shakllar (lar) ga umumlashtiriladi.

1-natija uchun titer kodi map bilan ishlaydi ( ro'yxat holda):

In [84]: np.fromiter((f(x) for x in range(4)),int)
Out[84]: array([0, 1, 4, 9])

In [86]: np.fromiter(map(f, range(4)),int)
Out[86]: array([0, 1, 4, 9])

Haqiqiy holatda o'z vaqtini qilish kerak.

1
qo'shib qo'ydi

Butun majmuada ishlaydigan operatsiyalardan foydalaning. Masalan, kirishni faqat kvadratchalar funksiyasi bilan (sizning namunangizdan ozgina tuzatilgan):

def f(x):
    return x**2

shunda siz faqat qilmoqchi edingiz

arr = f(X)

chunki NumPy bir vaqtning o'zida barcha kataloglarda ishlash uchun ** kabi operatorlarni belgilaydi.

Sizning haqiqiy vazifangiz juda sodda bo'lishi mumkin. Integrallarning mavjudligi haqida gapirasiz; butun majmuaviy amaliyotlar bilan shug'ullanish uchun argumentlarni boshqacha qabul qilish yoki integrallashlarni hisoblash uchun foydalanadigan narsalarni o'zgartirish kerak bo'ladi. Umuman olganda, odatda, butun qator operatsiyalari loop ichida Python-darajali kodni izlashga muhtoj bo'lgan har qanday narsani juda yaxshi bajaradi.

1
qo'shib qo'ydi

Butun majmuada ishlaydigan operatsiyalardan foydalaning. Masalan, kirishni faqat kvadratchalar funksiyasi bilan (sizning namunangizdan ozgina tuzatilgan):

def f(x):
    return x**2

shunda siz faqat qilmoqchi edingiz

arr = f(X)

chunki NumPy bir vaqtning o'zida barcha kataloglarda ishlash uchun ** kabi operatorlarni belgilaydi.

Sizning haqiqiy vazifangiz juda sodda bo'lishi mumkin. Integrallarning mavjudligi haqida gapirasiz; butun majmuaviy amaliyotlar bilan shug'ullanish uchun argumentlarni boshqacha qabul qilish yoki integrallashlarni hisoblash uchun foydalanadigan narsalarni o'zgartirish kerak bo'ladi. Umuman olganda, odatda, butun qator operatsiyalari loop ichida Python-darajali kodni izlashga muhtoj bo'lgan har qanday narsani juda yaxshi bajaradi.

1
qo'shib qo'ydi

Butun majmuada ishlaydigan operatsiyalardan foydalaning. Masalan, kirishni faqat kvadratchalar funksiyasi bilan (sizning namunangizdan ozgina tuzatilgan):

def f(x):
    return x**2

shunda siz faqat qilmoqchi edingiz

arr = f(X)

chunki NumPy bir vaqtning o'zida barcha kataloglarda ishlash uchun ** kabi operatorlarni belgilaydi.

Sizning haqiqiy vazifangiz juda sodda bo'lishi mumkin. Integrallarning mavjudligi haqida gapirasiz; butun majmuaviy amaliyotlar bilan shug'ullanish uchun argumentlarni boshqacha qabul qilish yoki integrallashlarni hisoblash uchun foydalanadigan narsalarni o'zgartirish kerak bo'ladi. Umuman olganda, odatda, butun qator operatsiyalari loop ichida Python-darajali kodni izlashga muhtoj bo'lgan har qanday narsani juda yaxshi bajaradi.

1
qo'shib qo'ydi

numpy.vectorize ni sinab ko'rishingiz mumkin. Funktsiya ro'yxatga yoki qatorga amal qilishning juda yaxshi usuli

import numpy as np

def foo(x):
    return x**2

foo = np.vectorize(foo)
arr = np.arange(10)

In [1]: foo(arr)                                                                                    
Out[1]: array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])  
1
qo'shib qo'ydi

numpy.vectorize ni sinab ko'rishingiz mumkin. Funktsiya ro'yxatga yoki qatorga amal qilishning juda yaxshi usuli

import numpy as np

def foo(x):
    return x**2

foo = np.vectorize(foo)
arr = np.arange(10)

In [1]: foo(arr)                                                                                    
Out[1]: array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])  
1
qo'shib qo'ydi

numpy.vectorize ni sinab ko'rishingiz mumkin. Funktsiya ro'yxatga yoki qatorga amal qilishning juda yaxshi usuli

import numpy as np

def foo(x):
    return x**2

foo = np.vectorize(foo)
arr = np.arange(10)

In [1]: foo(arr)                                                                                    
Out[1]: array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])  
1
qo'shib qo'ydi
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming