PowerShell 어레이 초기화
PowerShell에서 어레이를 초기화하는 가장 좋은 방법은 무엇입니까?
예를 들어, 코드는
$array = @()
for($i=0; $i -lt 5;$i++)
{
$array[$i] = $FALSE
}
오류가 발생합니다.
Array assignment failed because index '0' was out of range.
At H:\Software\PowerShell\TestArray.ps1:4 char:10
+ $array[$ <<<< i] = $FALSE
여기 두 가지 방법이 더 있습니다. 둘 다 매우 간결합니다.
$arr1 = @(0) * 20
$arr2 = ,0 * 20
입력된 배열을 생성하려는 경우 생성자의 기본값을 사용할 수도 있습니다.
> $a = new-object bool[] 5
> $a
False
False
False
False
False
부울의 기본값은 명백히 거짓이므로 이는 당신의 경우에 효과가 있습니다.마찬가지로 입력한 int[] 배열을 만들면 기본값인 0이 됩니다.
어레이를 초기화할 때 사용하는 또 다른 멋진 방법은 다음과 같습니다.
> $a = ($false, $false, $false, $false, $false)
> $a
False
False
False
False
False
또는 범위를 초기화할 수 있는 경우 다음과 같이 유용한 경우가 있습니다.
> $a = (1..5)> $a12345
이것이 어느 정도 도움이 되었기를 바랍니다!
또 다른 대안:
for ($i = 0; $i -lt 5; $i++)
{
$arr += @($false)
}
$arr이 아직 정의되지 않은 경우 이 작업이 작동합니다.
참고 - 이를 위한 더 나은(그리고 더 성능적인) 방법이 있습니다.아래의 https://stackoverflow.com/a/234060/4570 을 예로 들 수 있습니다.
배열이 비어 있으므로 원래 예제에서 오류를 반환한 다음 n번째 요소에 액세스하여 값을 할당하려고 합니다.
여기에는 많은 창의적인 답변들이 있는데, 이 게시물을 읽기 전에는 몰랐던 것들이 많습니다.작은 어레이의 경우 모두 문제가 없지만 n0번째에서 지적했듯이 성능에 상당한 차이가 있습니다.
여기서는 Measure-Command를 사용하여 각 초기화에 걸리는 시간을 확인합니다.예상할 수 있듯이 명시적 PowerShell 루프를 사용하는 모든 접근 방식은 사용하는 접근 방식보다 느립니다.넷 생성자 또는 PowerShell 연산자(IL 또는 네이티브 코드로 컴파일됨).
요약
New-Object
그리고.@(somevalue)*n
속도가 빠릅니다(100k 요소의 경우 약 20k 눈금).- 연산자가 " " " 인
n..m
10배 더 느립니다(200k 눈금). - 와
Add()
는 baseline( ticks)보다 1000배 느리며, 가 지정된 을 사용하여 때와 로 method는 ticks)보다.for()
또는ForEach-Object
a. (a.k.a.) (명일:foreach
,%
). - 추가대로
+=
최악입니다(1000개 요소에 대해서만 2M 눈금).
전체적으로 array*n은 다음과 같은 이유로 "최고"라고 생각합니다.
- 빠르네요.
- 형식의 기본값뿐만 아니라 모든 값을 사용할 수 있습니다.
- 값을 할 수 프롬프트에 합니다).
(1..10)*10 -join " "
또는('one',2,3)*3
) - 테르세 구문.
유일한 단점:
- 명백하지 않습니다.만약 여러분이 이 구조물을 전에 본 적이 없다면, 그것이 무엇을 하는지는 분명하지 않습니다.
그러나 어레이 요소를 어느 정도 값으로 초기화하려는 대부분의 경우 강력한 유형의 어레이가 필요합니다.든모작초하경으로 .$false
그러면 어레이는 다른 것을 수용할 수 있습니까?$false
또는$true
않다면, 그지않면다렇,면,New-Object type[] n
최선의 접근 방식입니다.
테스트
기본 배열을 만들고 크기를 지정한 다음 값을 할당합니다.
PS> Measure-Command -Expression {$a = new-object object[] 100000} | Format-List -Property "Ticks"
Ticks : 20039
PS> Measure-Command -Expression {for($i=0; $i -lt $a.Length;$i++) {$a[$i] = $false}} | Format-List -Property "Ticks"
Ticks : 28866028
부울의 배열을 만드는 것은 객체의 배열을 만드는 것보다 약간 느립니다.
PS> Measure-Command -Expression {$a = New-Object bool[] 100000} | Format-List -Property "Ticks"
Ticks : 130968
이것이 무엇을 하는지는 명확하지 않습니다. New-Object에 대한 설명서에는 두 번째 매개 변수가 에 전달되는 인수 목록이라고만 나와 있습니다.넷 객체 생성자.배열의 경우 매개 변수는 분명히 원하는 크기입니다.
+=로 추가
PS> $a=@()
PS> Measure-Command -Expression { for ($i=0; $i -lt 100000; $i++) {$a+=$false} } | Format-List -Property "Ticks"
나는 그것이 완료되기를 기다리는 것에 지쳤기 때문에 ctrl+c는 다음과 같습니다.
PS> $a=@()
PS> Measure-Command -Expression { for ($i=0; $i -lt 100; $i++) {$a+=$false} } | Format-List -Property "Ticks"
Ticks : 147663
PS> $a=@()
PS> Measure-Command -Expression { for ($i=0; $i -lt 1000; $i++) {$a+=$false} } | Format-List -Property "Ticks"
Ticks : 2194398
(6 * 3)이 (6 + 6 + 6)과 개념적으로 유사한 것처럼 ($somearray * 3)은 ($somearray + $somearray + $somearray + $somearray)와 동일한 결과를 제공해야 합니다.그러나 어레이의 경우 +는 추가가 아닌 연결입니다.
$array+=$timeout이 느린 경우 $array*$n도 느린 것으로 예상할 수 있지만 다음과 같은 경우는 아닙니다.
PS> Measure-Command -Expression { $a = @($false) * 100000 } | Format-List -Property "Ticks"
Ticks : 20131
Java에 StringBuilder 클래스가 있는 것처럼 추가할 때 여러 개체를 만들지 않습니다. 따라서 PowerShell에 ArrayList가 있는 것 같습니다.
PS> $al = New-Object System.Collections.ArrayList
PS> Measure-Command -Expression { for($i=0; $i -lt 1000; $i++) {$al.Add($false)} } | Format-List -Property "Ticks"
Ticks : 447133
PS> $al = New-Object System.Collections.ArrayList
PS> Measure-Command -Expression { for($i=0; $i -lt 10000; $i++) {$al.Add($false)} } | Format-List -Property "Ticks"
Ticks : 2097498
PS> $al = New-Object System.Collections.ArrayList
PS> Measure-Command -Expression { for($i=0; $i -lt 100000; $i++) {$al.Add($false)} } | Format-List -Property "Ticks"
Ticks : 19866894
연산자, "는 " " 입니다.Where-Object
루프:
PS> Measure-Command -Expression { $a = 1..100000 } | Format-List -Property "Ticks"
Ticks : 239863
Measure-Command -Expression { $a | % {$false} } | Format-List -Property "Ticks"
Ticks : 102298091
주의:
- 런 했습니다.
$a=$null
). - 테스트는 Atom 프로세서가 장착된 태블릿에서 수행되었습니다. 다른 컴퓨터에서 더 빠른 속도를 볼 수 있을 것입니다.[edit: 데스크톱 컴퓨터에서 약 2배 더 빠름.
- 여러 번의 런을 시도했을 때 상당한 차이가 있었습니다.정확한 숫자가 아닌 크기의 순서를 찾습니다.
- 테스트는 윈도우즈 8의 PowerShell 3.0을 사용했습니다.
승인
Array*n용 @halr9000, New-Object용 @Scott Sad 및 Lee Desmond, ArrayList용 @EBGreen 덕분입니다.
@n0rd 덕분에 성능에 대해 생각하게 되었습니다.
$array = 1..5 | foreach { $false }
여기 다른 아이디어가 있습니다.기억해야 해요, 기억해야 해요.아래의 NET:
$arr = [System.Array]::CreateInstance([System.Object], 5)
$arr.GetType()
$arr.Length
$arr = [Object[]]::new(5)
$arr.GetType()
$arr.Length
결과:
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
5
True True Object[] System.Array
5
용사를 합니다.new()
ISE에서 프로그래밍을 할 때 개체를 만들고 싶을 때 ISE가 모든 매개 변수 조합과 해당 유형에 대한 힌트를 제공합니다.그럴 필요 없어요New-Object
변수의 유형과 순서를 기억해야 합니다.
$array = @()
for($i=0; $i -lt 5; $i++)
{
$array += $i
}
제가 찾은 솔루션은 New-Object cmdlet을 사용하여 적절한 크기의 어레이를 초기화하는 것이었습니다.
$array = new-object object[] 5
for($i=0; $i -lt $array.Length;$i++)
{
$array[$i] = $FALSE
}
앞의 크기를 모를 경우 배열 대신 배열 목록을 사용합니다.
$al = New-Object System.Collections.ArrayList
for($i=0; $i -lt 5; $i++)
{
$al.Add($i)
}
여기 또 다른 일반적인 방법이 있습니다.
$array = for($i = 0; $i -le 4; $i++) { $false }
아니면 아이디어를 시도해 보세요.PowerShell 5.0+와 함께 작동합니다.
[bool[]]$tf=((,$False)*5)
$array = foreach($i in 1..5) { $false }
언급URL : https://stackoverflow.com/questions/226596/powershell-array-initialization
'programing' 카테고리의 다른 글
Xcode 6의 AutoLayout 제약조건을 사용한 애스펙트 핏 거동 에뮬레이션 (0) | 2023.05.11 |
---|---|
IntelliJ IDEA에서 예외 스로더 강조 (0) | 2023.05.11 |
MongoDB 'collection'에서 모든 'documents' 가져오기 (0) | 2023.05.11 |
비트맵 소스와 비트맵을 변환하는 좋은 방법이 있습니까? (0) | 2023.05.11 |
각도 2의 단추를 사용하여 다른 페이지로 이동합니다. (0) | 2023.05.11 |